You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:39:04