如何用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
相关产品推荐
相关产品推荐

