如何配置Spring Maven插件,兼顾可执行JAR与依赖引用需求
解决方法
核心思路
Spring Boot的repackage默认会把类塞进BOOT-INF/classes做成可执行JAR,但这种结构没法被其他模块当依赖用。最靠谱的方式是生成两个JAR:一个是供其他模块依赖的标准JAR(类在根目录),另一个是能直接java -jar运行的可执行JAR。
修改后的pom.xml配置
<build> <finalName>aWattar</finalName> <plugins> <!-- 1. 生成标准JAR:类在根目录,供其他模块依赖,同时在MANIFEST中指定main类 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 指定目标main类 --> <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass> <!-- 配置类路径,若直接运行该JAR需将依赖放在同目录的lib文件夹 --> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin> <!-- 2. 生成可执行JAR:带Spring Boot标准结构,直接运行无需额外处理依赖 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass> <!-- 给可执行JAR加后缀区分,生成文件名如aWattar-exec.jar --> <classifier>exec</classifier> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
实际效果
执行mvn package后会得到两个JAR:
aWattar.jar:标准结构,类位于JAR根目录,MANIFEST已指定main类,其他模块可直接引用作为依赖。若要直接运行,需将所有依赖放在与JAR同目录的lib文件夹,再执行java -jar aWattar.jar。aWattar-exec.jar:Spring Boot可执行JAR,自带所有依赖,直接执行java -jar aWattar-exec.jar即可启动程序。
单JAR方案(不推荐)
如果硬要一个JAR同时满足依赖和运行需求,需关闭Spring Boot的repackage,手动打包依赖并配置MANIFEST,但这种方式易引发依赖冲突,且Spring Boot自动配置可能受影响:
<properties> <spring-boot.repackage.skip>true</spring-boot.repackage.skip> </properties> <build> <finalName>aWattar</finalName> <plugins> <!-- 配置MANIFEST指定main类和类路径 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> <!-- 将依赖复制到项目构建目录的lib文件夹 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- 将类和lib目录打包成包含所有依赖的单JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> </plugins> </build>
该方案生成的JAR体积较大,后续维护成本高,仅在特殊场景下考虑使用。
内容的提问来源于stack exchange,提问作者Ulrich
相关产品推荐
相关产品推荐

