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

如何用Maven构建含特定类的普通JAR与完整Spring Boot可执行JAR?

解决方案

要实现普通JAR仅包含特定包、可执行JAR保留全部内容的需求,你需要给maven-jar-plugin配置多执行阶段,分别控制两个JAR的打包范围,同时让Spring Boot插件基于全量代码生成可执行JAR。具体配置如下:

<build>
    <plugins>
        <!-- 1. 配置普通JAR:仅包含指定包的类 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <!-- 第一个执行:生成默认的普通JAR(不带分类器) -->
                <execution>
                    <id>default-jar</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <includes>
                            <include>org/example/stuff/**</include>
                        </includes>
                        <!-- 排除不需要共享的资源、主类等 -->
                        <excludes>
                            <exclude>application*.yml</exclude>
                            <exclude>liquibase/**</exclude>
                            <exclude>org/example/MainClass.class</exclude>
                        </excludes>
                    </configuration>
                </execution>
                <!-- 第二个执行:生成全量JAR(带分类器full),供Spring Boot插件打包用 -->
                <execution>
                    <id>full-jar</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>full</classifier>
                        <!-- 包含所有类和资源 -->
                        <includes>
                            <include>**/*</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- 2. 配置Spring Boot插件:基于全量JAR生成可执行JAR -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.7.14</version>
            <executions>
                <execution>
                    <id>repackage</id>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <!-- 指定使用带full分类器的全量JAR作为基础 -->
                        <classifier>exec</classifier>
                        <mainClass>org.example.MainClass</mainClass>
                        <originalJar>target/${project.artifactId}-${project.version}-full.jar</originalJar>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置说明

  • 第一个maven-jar-plugin执行阶段:生成默认的普通JAR,通过<includes>指定要共享的包,<excludes>排除配置文件、Liquibase脚本、主类等不需要共享的内容。
  • 第二个maven-jar-plugin执行阶段:生成带full分类器的全量JAR,包含项目所有类和资源,专门给Spring Boot插件用。
  • spring-boot-maven-plugin通过<originalJar>指定基于全量JAR打包,最终生成带exec分类器的可执行JAR,保留所有内容。

为什么之前的配置会出问题

你之前的全局配置会让maven-jar-plugin只生成子集JAR,而Spring Boot插件默认会基于这个子集JAR打包,导致可执行JAR丢失资源和其他类。通过拆分执行阶段,就能让两个JAR的打包逻辑完全独立,互不影响。

内容的提问来源于stack exchange,提问作者red123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:16:05