使用maven-assembly-plugin打包,assembly的语法介绍(同时打多个包、排除依赖包、文件更改别名、自定义路径)

时间:2021-09-14 02:54:52

    使用maven打包时,maven-jar-plugin插件会在target目录下生成可执行的xxx-0.0.1-SNAPSHOT.jar文件,但是一般生产程序部署时需要打包自定义的格式包,这种情况就可以使用maven-assembly-plugin插件。

使用maven-assembly-plugin插件的几个步骤:

1、首先需要在maven工程配置文件pom.xml中配置,例子:

<build>			
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.4</version>
<configuration>
<finalName>Service</finalName>
<appendAssemblyId>true</appendAssemblyId>
<descriptors>
<descriptor>src/assembly/assembly.xml</descriptor>
<descriptor>src/assembly/assembly-fat-jar.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

appendAssemblyId: 打包后的包名是否包含assembly的id名,assembly的配置在后面介绍;

descriptor:引用的assembly配置文件,可以用多个,即可以同时打包多个格式的包;

execution:phase加入package后,则在执行maven package时就可以调用maven-assembly-plugin插件定义的打包方式。

2、assembly-fat-jar.xml文件配置:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>fat-jar</id>
<formats>
<format>tgz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<baseDirectory>Service</baseDirectory>
<files>
<file>
<source>target/service-0.0.1-SNAPSHOT.jar</source>
<outputDirectory>.</outputDirectory>
</file>
</files>
</assembly>
本例子是生成一个名为Service-fat-jar.tgz的压缩包,解压后里面只有一个jar文件:service-0.0.1-SNAPSHOT.jar。

可以看出service-0.0.1-SNAPSHOT.jar文件是直接从target目录下拷贝然后输出到当前包中的。(service-0.0.1-SNAPSHOT.jar文件前面说到过是maven-jar-plugin插件自动生产的)

3、assemblyr.xml文件配置:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>tgz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<baseDirectory>Service</baseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>false</unpack>
<scope>runtime</scope>
<excludes>
<exclude>*:service:*</exclude>
</excludes>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory></outputDirectory>
<includes>
<include>/conf/**</include>
</includes>
</fileSet>
</fileSets>
<files>
<file>
<source>target/service-0.0.1-SNAPSHOT.jar.original</source>
<outputDirectory>./lib</outputDirectory>
<destName>service-0.0.1-SNAPSHOT.jar</destName>
</file>
</files>
</assembly>
本例子是生成一个名为Service-bin.tgz的压缩包。
dependencySet:标签是指把项目依赖的所有包都打包输出到某个路径(本例中为lib目录); 并且会把maven-jar-plugin插件自动生成的service-0.0.1-SNAPSHOT.jar也导入到lib中。本次需求是需要把该jar排除掉,于是使用exclude标签

dependencySet中使用exclude标签中过滤的名字有点坑,不能直接写文件名。比如写<exclude>service-0.0.1-SNAPSHOT.jar</exclude>是不生效的。匹配的名字规则:

  • groupId:artifactId:type:classifier ( artifact.getDependencyConflictId() )
  • groupId:artifactId ( ArtifactUtils.versionlessKey( artifact ) )
  • groupId:artifactId:type:classifier:version ( artifact.getId() )
可参照https://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html

<file>标签很好用,可以自定义导入的文件的路径和别名,上述例子是把target目录下的service-0.0.1-SNAPSHOT.jar.original文件打包到本次包的lib目录并且更改名字为service-0.0.1-SNAPSHOT.jar


assembly还有很多语法可以根据项目需要去自定义,具体每个标签的定义可以参照官方文档:

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