簡單的說,maven-assembly-plugin 就是用來幫助打包用的,好比說打出一個什麼類型的包,包裏包括哪些內容等等。java
maven插件是在生命週期中某些階段執行的任務。一個插件完成一項功能。如下介紹幾種常見的插件。
如對於打包來講,有多種插件選擇。最多見的有如下3個:spring
plugin | function |
---|---|
maven-jar-plugin |
maven 默認打包插件,用來建立 project jar |
maven-shade-plugin |
用來打可執行包,executable(fat) jar |
maven-assembly-plugin |
支持定製化打包方式,例如 apache 項目的打包方式 |
如下選取幾個常見插件介紹。shell
編譯Java源碼,通常只需設置編譯的jdk版本apache
<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版本segmentfault
<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>
打成jar時,設定manifest的參數,好比指定運行的Main class,還有依賴的jar包,加入classpath中tomcat
<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>
用於遠程部署Java Web項目app
<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>
用於把多個jar包,打成1個jar包
通常Java項目都會依賴其餘第三方jar包,最終打包時,但願把其餘jar包包含在一個jar包裏。
與assembly相似,使用assembly便可。如下詳解assembly。maven
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))ui
能夠執行以下命令完成動做:
mvn assembly:single
或者是,綁定到package生命週期階段上(見上配置)觸發。後續能夠直接執行:
mvn package
這也是最多見的Assembly插件配置方式。
Assembly Descriptor可使用內置的,或者定製的。
要使用maven-assembly-plugin,須要指定至少一個要使用的assembly descriptor 文件。默認狀況下,maven-assembly-plugin內置了幾個能夠用的assembly descriptor:
使用 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>
通常來講,內置的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>
這個定義很簡單:
回到pom的配置中,自定義的configuration配置後,將會生成一個demo-demo.jar
文件在目錄 output
下,其中前一個demo
來自finalName
,後一個demo
來自assembly descriptor中的id
,其中的內容和默認的打包出來的jar相似。
若是隻想有finalName,則增長配置:
<appendAssemblyId>false</appendAssemblyId>
對於描述文件的元素,即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>distribution</id>
id 標識符,添加到生成文件名稱的後綴符。若是指定 id 的話,目標文件則是 ${artifactId}-${id}.tar.gz
maven-assembly-plugin 支持的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,能夠同時指定多個打包格式
<formats> <format>dir</format> </formats>
用來定製工程依賴 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>
管理一組文件的存放位置,核心元素以下表所示。
元素 | 類型 | 做用 |
---|---|---|
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。不經常使用的暫不介紹。
至此,便可按打包成功。下邊給出具體示例。