当前位置: 首页 > 工具软件 > fat32-lib > 使用案例 >

maven-assembly-plugin 打包可执行jar(fat jar)和配置文件与jar同时打包部署

尹英华
2023-12-01

java程序要打包可执行的jar,可以利用maven-assembly-plugin插件;

1)如果是需要将程序所有依赖的jar打包到同一个jar中,可以在pom.xml添加如下依赖:

[java]  view plain  copy
  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-assembly-plugin</artifactId>  
  4.     <version>3.0.0</version>  
  5.     <configuration>  
  6.         <descriptorRefs>  
  7.             <descriptorRef>jar-with-dependencies</descriptorRef>  
  8.         </descriptorRefs>  
  9.         <!-- MainClass in mainfest make a executable jar -->  
  10.         <archive>  
  11.           <manifest>  
  12.             <mainClass>com.xxx.MainClass</mainClass>  
  13.           </manifest>  
  14.         </archive>  
  15.     </configuration>  
  16.     <executions>  
  17.       <execution>  
  18.         <id>make-assembly</id>  
  19.                                      <!-- bind to the packaging phase -->  
  20.         <phase>package</phase>  
  21.         <goals>  
  22.             <goal>single</goal>  
  23.         </goals>  
  24.       </execution>  
  25.     </executions>  
  26. </plugin>  
使用上述方法,用jar-with-dependencies作为<descriptorRef>标签的值,则表示使用了maven自带的归档格式来生成带包含所有依赖的jar压缩包。
执行maven package后则生成包含所有依赖库的可执行Jar包,直接执行生成的jar包:java -jar xxx.jar则可执行程序。

需要注意的是必须要在mainClass中指定主类的路径。

2)程序运行所需的配置文件与可执行jar同时打包部署

大部分程序运行时都会有依赖的配置文件,有时候会需要将配置文件与fat jar一起打包部署,本例子用的是自定义的maven assembly xml来实现的:

pom.xml:

[java]  view plain  copy
  1. <plugin>  
  2.     <artifactId>maven-assembly-plugin</artifactId>  
  3.     <version>3.0.0</version>  
  4.     <configuration>  
  5.         <appendAssemblyId>true</appendAssemblyId>  
  6.         <archive>  
  7.             <manifest>  
  8.                 <mainClass>com.xxx.MainClass</mainClass>  
  9.             </manifest>  
  10.         </archive>  
  11.         <descriptors>  
  12.             <descriptor>src/assembly/assembly-fat-jar.xml</descriptor>  
  13.             <descriptor>src/assembly/assembly-conf.xml</descriptor>  
  14.         </descriptors>  
  15.     </configuration>  
  16.     <executions>  
  17.         <execution>  
  18.             <id>make-assembly</id> <!-- this is used for inheritance merges -->  
  19.             <phase>package</phase> <!-- bind to the packaging phase -->  
  20.             <goals>  
  21.                 <goal>single</goal>  
  22.             </goals>  
  23.         </execution>  
  24.     </executions>  
  25. </plugin>  
上面 maven-assembly-plugin插件的配置说明: maven打包根据两个自定义的描述文件来配置最终打包生产的文件结构:

assembly-fat-jar.xml:

[java]  view plain  copy
  1. <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"  
  2.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.           xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">  
  4.     <!-- TODO: a jarjar format would be better -->  
  5.     <id>jar-with-dependencies</id>  
  6.     <formats>  
  7.         <format>jar</format>  
  8.     </formats>  
  9.     <includeBaseDirectory>false</includeBaseDirectory>  
  10.     <dependencySets>  
  11.         <dependencySet>  
  12.             <outputDirectory>/</outputDirectory>  
  13.             <useProjectArtifact>true</useProjectArtifact>  
  14.             <unpack>true</unpack>  
  15.             <scope>runtime</scope>  
  16.         </dependencySet>  
  17.     </dependencySets>  
  18. </assembly>  

这个配置将在程序的target目录生成xxx--jar-with-dependencies.jar可执行程序,相当于前面例子<descriptorRef>jar-with-dependencies</descriptorRef>的功能,这个jar在下面的配置中打包会用到。


assembly-conf.xml:

[java]  view plain  copy
  1. <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"  
  2.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.           xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">  
  4.     <id>fat-jar</id>  
  5.     <formats>  
  6.         <format>tgz</format>  
  7.     </formats>  
  8.     <includeBaseDirectory>true</includeBaseDirectory>  
  9.     <baseDirectory>pojectDirectory</baseDirectory>  
  10.     <fileSets>  
  11.         <fileSet>  
  12.             <includes>  
  13.                 <include>conf/**</include>  
  14.                 <include>sampleData/**</include>  
  15.             </includes>  
  16.         </fileSet>  
  17.     </fileSets>  
  18.     <files>  
  19.     <file>  
  20.     <source>target/xxx-jar-with-dependencies.jar</source>  
  21.     <outputDirectory>lib</outputDirectory>  
  22.     </file>  
  23.     </files>  
  24. </assembly>  
这个配置将产生名字为xxx-fat-jar.tgz的压缩包,即程序最终打包的包。包含三个目录:conf/ 、sampleData/ 、lib/ 。

其中<include>conf/**</include>和<include>sampleData/**</include>是程序中需要被打包的配置文件目录,可根据需要修改。

<file><source>target/xxx--jar-with-dependencies.jar</source><outputDirectory>lib</outputDirectory></file>这段是将前面生产的jar打包到压缩文件中的lib目录下。

 类似资料: