maven--外掛篇(assembly外掛)
簡書:https://sg.jianshu.io/p/5eab75d71056
知乎:https://zhuanlan.zhihu.com/p/74691643
原文:https://segmentfault.com/a/1190000016237395?utm_source=tag-newest
官網:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
1. 簡介
簡單的說,maven-assembly-plugin 就是用來幫助打包用的,比如說打出一個什麼型別的包,包裡包括哪些內容等等。
2. 常見的maven外掛
maven外掛是在生命週期中某些階段執行的任務。一個外掛完成一項功能。以下介紹幾種常見的外掛。
如對於打包來說,有多種外掛選擇。最常見的有以下3個:
plugin | function |
---|---|
maven-jar-plugin |
maven 預設打包外掛,用來建立 project jar |
maven-shade-plugin |
用來打可執行包,executable(fat) jar |
maven-assembly-plugin |
支援定製化打包方式,例如 apache 專案的打包方式 |
以下選取幾個常見外掛介紹。
maven-compiler-plugin
編譯Java原始碼,一般只需設定編譯的jdk版本
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
或者在properties設定jdk版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
maven-jar-plugin
打成jar時,設定manifest的引數,比如指定執行的Main class,還有依賴的jar包,加入classpath中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>/data/lib</classpathPrefix>
<mainClass>com.zhang.spring.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
tomcat7-maven-plugin
用於遠端部署Java Web專案
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://59.110.162.178:8080/manager/text</url>
<username>linjinbin</username>
<password>linjinbin</password>
</configuration>
</plugin>
maven-shade-plugin
用於把多個jar包,打成1個jar包
一般Java專案都會依賴其他第三方jar包,最終打包時,希望把其他jar包包含在一個jar包裡。
與assembly類似,使用assembly即可。以下詳解assembly。
3. maven-assembly-plugin
1.在pom中引入外掛
1.首先我們需要在pom.xml中配置maven的assembly外掛
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution><!-- 配置執行器 -->
<id>make-assembly</id>
<phase>package</phase><!-- 繫結到package生命週期階段上 -->
(1)
<goals>
<goal>single</goal><!-- 只執行一次 -->
</goals>
(2)
<configuration>
<finalName>${project.name}</finalName>
<!--主類入口等-->
...
<descriptor>src/main/assembly/assembly.xml</descriptor><!--配置描述檔案路徑-->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.兩個主要的引數設定(上述中的(1)(2))
I) Assembly外掛的goals
- single
- help
可以執行如下命令完成動作:
mvn assembly:single
或者是,繫結到package生命週期階段上(見上配置)觸發。後續可以直接執行:
mvn package
這也是最常見的Assembly外掛配置方式。
II)Assembly descriptor
Assembly Descriptor可以使用內建的,或者定製的。
(1) 使用內建的Assembly Descriptor
要使用maven-assembly-plugin,需要指定至少一個要使用的assembly descriptor 檔案。預設情況下,maven-assembly-plugin內建了幾個可以用的assembly descriptor:
- bin : 類似於預設打包,會將bin目錄下的檔案打到包中;
- jar-with-dependencies : 會將所有依賴都解壓打包到生成物中;
- src :只將原始碼目錄下的檔案打包;
- project : 將整個project資源打包。
使用 descriptorRefs來引用(官方提供的定製化打包方式)【不建議使用】
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
上述直接配置jar-with-dependencies
打包方式。不需要引入額外檔案。實際上,上述4中預定義的assembly descriptor有對應的xml。要檢視它們的詳細定義,可以到maven-assembly-plugin.jar裡去看,例如對應 bin 的assembly descriptor 原始檔案如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/site</directory>
<outputDirectory>docs</outputDirectory>
</fileSet>
</fileSets>
</assembly>
(2) 自定義Assembly Descriptor
一般來說,內建的assembly descriptor都不滿足需求,這個時候就需要寫自己的assembly descriptor的實現了。
使用descriptors
,指定打包檔案src/assembly/assembly.xml
,即在配置檔案內指定打包操作要使用這個自定義assembly descriptor(自定義的xml中配置),需要如下配置,即要引入描述檔案:
<configuration> <finalName>demo</finalName> <descriptors> <!--描述檔案路徑--> <descriptor>src/assembly/assembly.xml</descriptor> </descriptors> <outputDirectory>output</outputDirectory> </configuration>
示例:src/assembly/assembly.xml
:
<?xml version='1.0' encoding='UTF-8'?> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>demo</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>${project.build.directory}/classes</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly>
這個定義很簡單:
- format:指定打包型別;
- includeBaseDirectory:指定是否包含打包層目錄(比如finalName是output,當值為true,所有檔案被放在output目錄下,否則直接放在包的根目錄下);
- fileSets:指定要包含的檔案集,可以定義多個fileSet;
- directory:指定要包含的目錄;
- outputDirectory:指定當前要包含的目錄的目的地。
回到pom的配置中,自定義的configuration配置後,將會生成一個demo-demo.jar
檔案在目錄output
下,其中前一個demo
來自finalName
,後一個demo
來自assembly descriptor中的id
,其中的內容和預設的打包出來的jar類似。
如果只想有finalName,則增加配置:
<appendAssemblyId>false</appendAssemblyId>
對於描述檔案的元素,即assembly.xml中的配置節點的詳細配置,在此稍作總結,見下。
assembly.xml節點配置
在配置assembly.xml之前,我們先看一下pom中引入外掛的結構。
<project> [...] <build> [...] <plugins> <plugin> ------------(1)座標----------- <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> ------------(2)入口----------- <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.***.startup.BootStrap</mainClass> <!-- 你的主類名 --> </manifest> </archive> ------------(3)描述----------- <descriptors> <descriptor>src/assembly/assembly.xml</descriptor> </descriptors> </configuration> [...] </project>
archive說明
上面的mainClass
標籤中的內容替換成自己的main
函式所在的類,前面要包含package
名字,也就是package_name.MainClassName
。
assembly.xml檔案的主要結構如下。
id
<id>distribution</id>
id 識別符號,新增到生成檔名稱的字尾符。如果指定 id 的話,目標檔案則是${artifactId}-${id}.tar.gz
formats
maven-assembly-plugin 支援的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同時指定多個打包格式
<formats> <format>dir</format> </formats>
dependencySets
用來定製工程依賴 jar 包的打包方式,核心元素如下表所示。
元素 | 型別 | 作用 |
---|---|---|
outputDirectory | String | 指定包依賴目錄,該目錄是相對於根目錄 |
includes | List<String> | 包含依賴 |
excludes | List<String> | 排除依賴 |
<dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <excludes> <exclude>${project.groupId}:${project.artifactId}</exclude> </excludes> </dependencySet> <dependencySet> <outputDirectory>/</outputDirectory> <includes> <include>${project.groupId}:${project.artifactId}</include> </includes> </dependencySet> </dependencySets>
fileSets
管理一組檔案的存放位置,核心元素如下表所示。
元素 | 型別 | 作用 |
---|---|---|
outputDirectory | String | 指定檔案集合的輸出目錄,該目錄是相對於根目錄 |
includes | List<String> | 包含檔案 |
excludes | List<String> | 排除檔案 |
fileMode | String | 指定檔案屬性,使用八進位制表達,分別為(User)(Group)(Other)所屬屬性,預設為 0644 |
<fileSets> <fileSet> <directory>shell</directory> <outputDirectory>/shell</outputDirectory> </fileSet> <fileSet> <directory>cluster_config</directory> <outputDirectory>/cluster_config</outputDirectory> </fileSet> </fileSets>
其他
其他的,如files節點基本類似fileSets。不常用的暫不介紹。
至此,即可按打包成功。下邊給出具體示例。
demo: https://segmentfault.com/a/1190000016241263