如何使用maven-assembly-plugin打包可执行jar而非.jar.original到zip
问题原因
你的问题本质是插件执行顺序冲突:
- Spring Boot的
spring-boot-maven-plugin在package阶段会执行repackage逻辑:先把Maven原生打包生成的普通jar重命名为xxx.jar.original,再生成包含所有依赖、可直接运行的可执行jar - Maven同一生命周期阶段下的插件,按照
pom.xml中声明的先后顺序执行。你当前的配置里maven-assembly-plugin声明在spring-boot-maven-plugin之前,所以assembly打包时Spring Boot还没生成可执行jar,打包进zip的就是未处理的普通jar,后续才被重命名为.original,导致你误以为打包的是.original文件。
解决方案
第一步:调整pom.xml中插件的声明顺序
把spring-boot-maven-plugin挪到maven-assembly-plugin的前面,确保先完成可执行jar的生成,再执行assembly打包:
<build> <plugins> <!-- 其他插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>true</excludeDevtools> </configuration> <!-- 可选:显式绑定repackage到package阶段,确保执行顺序 --> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- assembly插件放在spring-boot插件之后 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> <finalName>${project.artifactId}-${project.version}</finalName> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!-- 其他插件 --> </plugins> </build>
第二步(可选优化):修改assembly.xml配置
避免硬编码文件名和路径,更灵活适配项目版本变更:
<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>assembly-id</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <!-- 明确指定读取target目录下的文件,避免扫描项目根目录的其他文件 --> <directory>${project.build.directory}</directory> <outputDirectory></outputDirectory> <includes> <include>**/*.yml</include> <!-- 用变量代替硬编码的jar名 --> <include>${project.artifactId}-${project.version}.jar</include> </includes> </fileSet> </fileSets> </assembly>
修改后执行mvn clean package,生成的zip包中就会包含可以直接运行的可执行jar文件。
内容的提问来源于stack exchange,提问作者Divya Kampasi
相关产品推荐
相关产品推荐

