多 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 插件。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部