天天看點

maven-assembly-plugin定制化打包

作者:stonevV9S

常用

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <configuration>
    <archive>
      <manifest>
        <main>com.jdxia.EurekaServer</main>
      </manifest>
    </archive>
    <descriptorRefs>
      <!-- 會将所有依賴都解壓打包到生成物中-->
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    
    <!--false,mvn deploy不會把assembly打的zip包上傳到nexus-->
    <attach>false</attach>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id>   <!--名字任意 -->
      <phase>package</phase>   <!-- 綁定到package生命周期階段上 -->
      <goals>
        <goal>single</goal>   <!-- 隻運作一次 -->
      </goals>
    </execution>
  </executions>
</plugin>           

簡介

簡單的說,maven-assembly-plugin 就是用來幫助打包用的,比如說打出一個什麼類型的包,包裡包括哪些内容等等。

預設情況下,打jar包時,隻有在類路徑上的檔案資源會被打包到jar中,并且檔案名是${artifactId}-${version}.jar,下面看看怎麼用maven-assembly-plugin插件來定制化打包。

首先需要添加插件聲明:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>${project.version}</id><!--名字任意 -->
      <phase>package</phase>   <!-- 綁定到package生命周期階段上 -->
      <goals>
        <goal>single</goal>   <!-- 隻運作一次 -->
      </goals>
      <configuration>
        <!-- 打封包件名字不包含 assembly.xml 中 id -->
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>   <!--描述檔案路徑-->
          <descriptor>src/main/assembly/dist.xml</descriptor>
        </descriptors>
        <!--這樣配置後,mvn deploy不會把assembly打的zip包上傳到nexus-->
        <attach>false</attach>
      </configuration>
    </execution>
  </executions>
</plugin>           

dist.xml檔案描述:

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
  <!-- 不配置會報錯:Assembly ID must be present and non-empty -->
  <id>dist</id>
  <formats>
    <!--壓縮檔案的類型-->
    <format>tar.gz</format>
  </formats>
  <!--指明打包後是否有分發包的最外層,如果不寫,預設是true-->
  <includeBaseDirectory>true</includeBaseDirectory>
  <fileSets>
    <!--需要包含的檔案與輸出的路徑-->
    <fileSet>
      <!--指明要對src/main/assembly/bin檔案夾操作-->
      <directory>src/main/assembly/bin</directory>
      <!--指明經過assembly插件打包後bin目錄會放置在項目根目錄下-->
      <outputDirectory>bin</outputDirectory>
      <!--指明bin目錄下所有檔案的權限為755-->
      <fileMode>0755</fileMode>
    </fileSet>
    <fileSet>
      <directory>src/main/assembly/conf</directory>
      <outputDirectory>conf</outputDirectory>
      <fileMode>0644</fileMode>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>lib</outputDirectory>
      <!--指明經過assembly插件打包後lib目錄會包含哪些jar包-->
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>logs</outputDirectory>
      <fileMode>0755</fileMode>
      <!--指明經過assembly插件打包後logs過濾掉哪些檔案-->
      <excludes>
        <!-- **/* 代表是任意路徑下任務檔案-->
        <exclude>**/*</exclude>
      </excludes>
    </fileSet>
  </fileSets>
</assembly>           

maven打包

-DskipTests和-Dmaven.test.skip=true的差別是
 
-DskipTests,不執行測試用例,但編譯測試用例類生成相應的class檔案至target/test-classes下。
-Dmaven.test.skip=true,不執行測試用例,也不編譯測試用例類。           

Assembly Descriptor

要使用maven-assembly-plugin,需要指定至少一個要使用的assembly descriptor 檔案。預設情況下,maven-assembly-plugin内置了幾個可以用的assembly descriptor:

  • bin : 類似于預設打包,會将bin目錄下的檔案打到包中;
  • jar-with-dependencies : 會将所有依賴都解壓打包到生成物中;
  • src :隻将源碼目錄下的檔案打包;
  • project : 将整個project資源打包。

自己定義的話

這個定義很簡單:

  • format:指定打包類型;
  • includeBaseDirectory:指定是否包含打包層目錄(比如finalName是output,當值為true,所有檔案被放在output目錄下,否則直接放在包的根目錄下);
  • fileSets:指定要包含的檔案集,可以定義多個fileSet;
  • directory:指定要包含的目錄;
  • outputDirectory:指定目前要包含的目錄的目的地。

添加檔案

上面示範了添加所有編譯後的資源,同樣的可以增加其他資源,例如想添加目前工程目錄下的某個檔案 b.txt ,在assembly descriptor的assembly結點下增加

<files>
    <file>
        <source>b.txt</source>
        <outputDirectory>/</outputDirectory>
    </file>
</files>           

這裡用到了 files 元素類型,可以想象 fileSets 下的結點都是針對檔案夾的;files 下的結點都是針對檔案的。

排除檔案

在 fileSet 裡可以使用 includes 和 excludes 來更精确的控制哪些檔案要添加,哪些檔案要排除。

例如要排除某個目錄下所有的txt檔案:

<fileSet>  
    <directory>${project.build.directory}/classes</directory>  
    <outputDirectory>/</outputDirectory>  
    <excludes>  
        <exclude>**/*.txt</exclude>  
    </excludes>  
</fileSet>           

或者某個目錄下隻想 .class 檔案

<fileSet>
    <directory>${project.build.directory}/classes</directory>
    <outputDirectory>/</outputDirectory>
    <includes>
        <include>**/*.class</include>
    </includes>
</fileSet>           

添加依賴

如果想把一些依賴庫打到包裡,可以用 dependencySets 元素,例如最簡單的,把目前工程的所有依賴都添加到包裡:

<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
    </dependencySet>
</dependencySets>           

在assembly下添加以上配置,則目前工程的依賴和工程本身生成的jar都會被打包進來。

如果要排除工程自身生成的jar,則可以添加

<useProjectArtifact>false</useProjectArtifact>