如何用Maven assembly生成含可执行JAR及所有资源的ZIP包?
问题核心原因
你当前的配置存在2个核心错误:
- 错误将assembly插件的
descriptor配置写在了maven-shade-plugin的参数中,shade插件不识别该配置,也不会负责生成zip包 - assembly.xml中同时配置了指向普通项目jar的file规则、以及会引入未shade的项目jar和依赖的dependencySet规则,导致zip中打包的是普通jar而非可运行的shaded jar
修正步骤
1. 替换pom.xml中的插件配置
删除原有的shade插件配置,替换为以下两个独立插件配置,执行顺序自动为shade先生成可运行jar,assembly后打包zip:
<plugins> <!-- 第一步:shade插件生成带主类的可运行jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.sgs.terminal.Run</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <!-- 第二步:assembly插件打包zip --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin> </plugins>
2. 修正assembly.xml配置
如果你已经通过shade插件将所有依赖打入了可运行jar中,不需要在zip中额外存放依赖jar,可以删除原有的dependencySet配置,避免空间浪费,修正后的assembly.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>dist</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <files> <!-- 引入shade生成的可运行jar --> <file> <source>target/${project.artifactId}-${project.version}.jar</source> </file> </files> <!-- 若确实需要额外将依赖放到lib目录,再保留以下dependencySet配置,否则删除 --> <!-- <dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <useProjectArtifact>false</useProjectArtifact> <scope>compile</scope> </dependencySet> </dependencySets> --> <fileSets> <fileSet> <directory>${project.basedir}</directory> <includes> <include>README*</include> <include>LICENSE*</include> <include>NOTICE*</include> <include>pom.xml</include> </includes> <useDefaultExcludes>true</useDefaultExcludes> </fileSet> <fileSet> <directory>${project.build.sourceDirectory}/src</directory> <useDefaultExcludes>true</useDefaultExcludes> </fileSet> <fileSet> <directory>lib</directory> <outputDirectory>lib</outputDirectory> <includes> <include>*</include> <include>*/*</include> </includes> </fileSet> <fileSet> <directory>images</directory> <outputDirectory>images</outputDirectory> <includes> <include>*</include> <include>*/*</include> </includes> </fileSet> <fileSet> <directory>${project.basedir}</directory> <includes> <include>*.dll</include> </includes> </fileSet> </fileSets> </assembly>
3. 执行验证
运行mvn clean package命令,即可在target目录下得到包含可运行shaded jar和所有指定文件的zip包。
内容的提问来源于stack exchange,提问作者maryem neyli
相关产品推荐
相关产品推荐

