Maven-子模块相互依赖打包时报错:程序类找不到

问题

在搭建的一个基于SpringBoot的maven工程中(git地址),子模块间有项目依赖,biz-order-service依赖了common模块,父工程的pom.xml文件中配置了maven的打包插件:

1
2
3
4
5
6
7
8
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

在IDEA编辑器中将整个工程运行maven的打包命令时,biz-order-service的打包任务报错:程序包com.lzumetal.cloud.common.resp不存在。但这个包明明就是在common模块中的,而且common模块是已经成功打包至了本地。

解决方案

在被依赖的common模块的pom.xml文件中增加打包配置:

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--被依赖的公共模块必须加上这个,打包之后启动,选择后面带EXE的启动,依赖该模块的其他模块就不会因为找不到依赖而打包出错-->
<classifier>exe</classifier>
</configuration>
</plugin>
</plugins>
</build>

分析

导致报错的原因:spring-boot-maven-plugin打包出来的jar是不可依赖的
解决方案:官方文档告诉我们有两种解决方案,一是移动代码,消除模块间的依赖;二是将被依赖的模块打成两个jar包。我们上面的解决方案即是第二种,通过给属性classifier指定一个值,maven打包时会多打一个jar,并且这个jar名的后面会加上这个值作为后缀,比如我将common模块打包后,得到了两个jar包:common-1.0-SNAPSHOT.jar 和 common-1.0-SNAPSHOT-exe.jar。biz-order-service模块再打包就不会再报错了。

------ 本文完 ------