多 module Spring-Boot 项目 repackage 问题
【多 module Spring-Boot 项目 repackage 问题】
某项目拆分通用工具类出来为单个 Module 时出现的问题,以下为模拟项目报错
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile) on project module-b: Compilation failure[ERROR] /D:/github/multi-modules/module-b/src/test/java/com/nevertrouble/demo/moduleb/CallModuleAClassTest.java:[3,42] 程序包com.nevertrouble.demo.modulea.util不存在
引起问题的原因:拆分出来模块实际并不为 spring-boot 项目,却使用了 spring-boot-maven-plugin 进行打包,导致其他模块在编译时找不到此模块的包(idea 内部可以跳转)。
spring-boot-maven-plugin中的repackage打包出来 jar 包不可被依赖。
问题项目还原
父项目 multi-modules
<project><parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.4.7version><relativePath/> parent><groupId>com.nevertrouble.demogroupId><artifactId>multi-modulesartifactId><version>0.0.1-SNAPSHOTversion><name>multi-modulesname><description>多模块项目description><packaging>pompackaging><modules><module>module-amodule><module>module-bmodule>modules><dependencies>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>project>
module-a 模块 pom.xml
<project><parent><groupId>com.nevertrouble.demogroupId><artifactId>multi-modulesartifactId><version>0.0.1-SNAPSHOTversion>parent><artifactId>module-aartifactId><name>module-aname><dependencies>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>project>
module-b 的 pom.xml
<project><parent><groupId>com.nevertrouble.demogroupId><artifactId>multi-modulesartifactId><version>0.0.1-SNAPSHOTversion>parent><artifactId>module-bartifactId><name>module-bname><dependencies><dependency><groupId>com.nevertrouble.demogroupId><artifactId>module-aartifactId><version>0.0.1-SNAPSHOTversion>dependency>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>project>
当在父项目中存在 spring-boot-maven-plugin 时,子模块即便没有此插件,依旧会使用此插件进行打包,所以仅删除 module-a 中的 spring-boot-maven-plugin 是不可行的,在编译 module-a 时依旧会使用此插件。
解决方法
方法 1
同时删除 父项目 multi-modules 和 子模块 module-a 中的 spring-boot-maven-plugin 插件,则在 multi-modules 项目下进行 mvn clean package 时可以顺利打包。
这个方案有一些小瑕疵, module-a 打出来包,没有其所依赖的那些 lib,仅仅是它本身的类的编译结果。
方法 2
- 不 删除父项目里的
spring-boot-maven-plugin插件 - 修改
module-a中的spring-boot-maven-plugin插件配置,跳过repackage
<plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId><executions><execution><id>repackageid><goals><goal>repackagegoal>goals><configuration><skip>trueskip>configuration>execution>executions>plugin>
plugins>
这个方案同样有 方法 1 中的问题,module-a 打出来的包不包含其依赖的 lib。
module-a 打包依赖 lib
在 方法 1 或 方案 2 的基础上,添加 maven-shade-plugin 插件,用于打包 module-a 的依赖 lib。
<plugins><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-shade-pluginartifactId><executions><execution><configuration><createDependencyReducedPom>falsecreateDependencyReducedPom>configuration><phase>packagephase><goals><goal>shadegoal>goals>execution>executions>plugin>
plugins>
总结
spring-boot-maven-plugin中的repackage打包出来 jar 包不可被依赖。- 对非
spring-boot的模块,如果父项目有spring-maven-plugin,需要在此模块中跳过repackage。 - 如果要打包非
spring-boot的项目及其依赖包,需要使用其他插件,这里举例使用了maven-shade-plugin。 - ps:
spring-boot-maven-plugin也依赖了maven-shade-plugin插件。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
