`

maven-assembly-plugin 的includeBaseDirectory研究

 
阅读更多

需求:

这个问题一度困扰了我好几个小时,我一开始使用maven-assembly-plugin构建tar分发包的时候,发现每次最终打包,都会在最外层有个包装层,比如我要构建的tar分发包的artifactId为abc ,那么最终打包完的tar文件总是内含abc目录,然后才是其他子目录sub1,sub2。而我们所希望的是当untar时候,能够直接出来的是子目录(sub1,sub2),而不是abc目录+abc目录里的子目录(/abc/sub1,/abc/sub2)的形式。

解决方案:

其实只要在assembly.xml中加上<includeBaseDirectory>元素,并且让其设为false就可以了,如下:

<assembly>  
      
  <id>tarball</id>  
      
  <formats>  
      
    <format>tar</format>  
      
  </formats>  
      
        
      
  <!--fixed the wrapper folder issue-->  
      
  <includeBaseDirectory>false</includeBaseDirectory>  
      
       
      
  <fileSets>  
      
 ...

关于这个参数的含义,可以参见maven-assembly-plugin的官网:

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

深入分析:

为什么这样可以呢,我们可以对maven-assembly-plugin的源代码进行研究。

首先,当我们在pom.xml中使用maven-assembly-plugin并且在<descriptor>中配置了assembly.xml文件的位置时候:

<build>  
                 <plugins>  
                          <plugin>  
                                   <groupId>org.apache.maven.plugins</groupId>  
                                   <artifactId>maven-assembly-plugin</artifactId>  
                                   <version>2.2.1</version>  
                                   <configuration>  
                                            <appendAssemblyId>false</appendAssemblyId>  
                                            <descriptors>  
                                                    <descriptor>src/main/assembly/assembly.xml</descriptor>  
                                            </descriptors>  
                                   </configuration>  
                                   <executions>  
                                            <execution>  
                                                    <id>make-assembly</id>  
                                                    <phase>package</phase>  
                                                    <goals>  
                                                             <goal>single</goal>  
                                                    </goals>  
                                            </execution>  
                                   </executions>  
                          </plugin>  
                         ..... 
                 </plugins>  
         </build>

插件会去调用DefaultAssemblyReader的readAssemblies()方法,然后调用如下代码进行遍历<descriptors>元素:

for ( int i = 0; i < descriptors.length; i++ ) 
          { 
              getLogger().info( "Reading assembly descriptor: " + descriptors[i] ); 
              addAssemblyFromDescriptor( descriptors[i], locator, configSource, assemblies ); 
          } 
      }

我们继续跟进到addAssemblyFromDescriptor方法,可以看出它其实是用来读取一个asssembly descriptor文件(也就是我们例子中的assembly.xml),忽略参数检查,它其实核心代码如下:

private Assembly addAssemblyFromDescriptor( final String spec, final Locator locator, 
                                               final AssemblerConfigurationSource configSource, 
                                               final List<Assembly> assemblies ) 
       throws AssemblyReadException, InvalidAssemblerConfigurationException 
   { 
      ... 
       Reader r = null; 
       try
       { 
           // TODO use ReaderFactory.newXmlReader() when plexus-utils is upgraded to 1.4.5+ 
           r = new InputStreamReader( location.getInputStream(), "UTF-8" ); 
     
           File dir = null; 
           if ( location.getFile() != null ) 
           { 
               dir = location.getFile().getParentFile(); 
           } 
     
           final Assembly assembly = readAssembly( r, spec, dir, configSource ); 
     
           assemblies.add( assembly ); 
     
           return assembly; 
       } 
     ... 
   }

所以这里可以看出,它最终在11行新建InputStreamReader,并在第19行读取assembly descriptor文件,最终读取的结果存储在Assembly对象模型中,而Assembly这个模型是有includeBaseDirectory这个成员变量的:

/** 
    * Set includes a base directory in the final archive. For 
    * example, 
    *             if you are creating an assembly named 
    * "your-app", setting 
    *             includeBaseDirectory to true will create an 
    * archive that 
    *             includes this base directory. If this option is 
    * set to false 
    *             the archive created will unzip its content to 
    * the current 
    *             directory. Default value is true. 
    *  
    * @param includeBaseDirectory 
    */
   public void setIncludeBaseDirectory( boolean includeBaseDirectory ) 
   { 
       this.includeBaseDirectory = includeBaseDirectory; 
   } //-- void setIncludeBaseDirectory( boolean )

以上是解析assembly descriptor并且设置了includeBaseDirectory,现在我们来看下如何使用这个属性。很显然,在不看代码之前,我们很容易猜想到,它肯定影响了最终打包的行为,正如我们所期望的一样。

分享到:
评论

相关推荐

    SpringBoot项目使用maven-assembly-plugin根据不同环境打包成tar.gz或者zip

    `maven-assembly-plugin`是Maven的一个插件,用于生成项目的归档文件,如tar.gz或zip,这在分发和部署软件时非常有用。本篇将详细介绍如何利用`maven-assembly-plugin`在Spring Boot项目中实现这个功能。 首先,`...

    Maven3种打包方式中maven-assembly-plugin的使用详解

    Maven3种打包方式中maven-assembly-plugin的使用详解 Maven 作为一个流行的项目管理工具,提供了多种方式来打包项目。其中,maven-assembly-plugin 是一个非常强大和灵活的插件,支持自定义的打包结构,并且可以...

    maven-assembly 自定义打包方式

    而`maven-assembly-plugin`是Maven的一个插件,用于创建自定义的打包(assembly)格式,比如tar、tar.gz、zip等。这个插件允许开发者在打包过程中包含额外的资源,如配置文件、文档等,使得最终的发布包更完整,便于...

    打jar包注意点.docx

    总结来说,通过在`pom.xml`中正确配置`maven-jar-plugin`和`maven-assembly-plugin`,并配合`assembly.xml`文件,可以确保批处理项目被打包成一个可执行的JAR文件,其中包含了所有必要的依赖,并且能够明确指定主类...

    使用Maven assembly打多个自定义包及War包简介

    &lt;artifactId&gt;maven-assembly-plugin &lt;version&gt;3.3.0 &lt;!-- 配置assembly描述符 --&gt; &lt;descriptorRef&gt;jar-with-dependencies &lt;id&gt;make-assembly &lt;phase&gt;package &lt;goal&gt;single &lt;/plugin&gt; ...

    maven assembly 插件 代码实现

    &lt;artifactId&gt;maven-assembly-plugin &lt;version&gt;3.3.0 &lt;descriptorRef&gt;jar-with-dependencies &lt;mainClass&gt;com.example.MainClass&lt;/mainClass&gt; &lt;id&gt;make-assembly &lt;phase&gt;package &lt;goal&gt;...

    maven 使用assembly 进行打包的方法

    而Maven Assembly Plugin则是Maven的一个插件,它允许开发者自定义构建过程,将项目的各种输出合并成一个单一的归档文件(如ZIP、TAR.GZ等),这对于分发软件或集成测试非常有用。本文将详细介绍如何使用Maven ...

    assembly.zip

    Maven Assembly Plugin是Maven生态系统中的一个关键组件,它的主要功能是将项目的所有依赖、资源和源代码打包成一个可分发的格式,如JAR、WAR或ZIP。在项目开发过程中,开发者通常会使用它来创建最终的发布版本,...

    Dubbo部署流程

    &lt;artifactId&gt;maven-assembly-plugin &lt;descriptor&gt;src/main/assembly/assembly.xml &lt;id&gt;make-assembly &lt;phase&gt;package &lt;goal&gt;single &lt;/plugin&gt; ``` 这里的`&lt;descriptor&gt;`标签指定了...

Global site tag (gtag.js) - Google Analytics