常用
<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>