今天在干活时发现了 Maven 在对多模块打包时的一个小坑,做个记录,也希望能帮助到遇到相同问题的朋友。
我的项目结构如下:
![](https://img.haomeiwen.com/i5464539/4f9c09b668b6dc99.jpg)
project 为maven父项目,app、authorize、core为期子模块,app与authorize模块分别依赖core模块,app同时依赖authorize模块。project的pom.xml声明如下:
![](https://img.haomeiwen.com/i5464539/a1efe458d78e86fe.jpg)
整个项目基于Spring Boot构建,使用Maven管理依赖、编译、打包。
app 模块为项目入口,包含Spring Boot Application。maven 编译插件配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>test</finalName>
</build>
问题描述
我在 core 模块中添加了一项功能类(演示类为Test):
![](https://img.haomeiwen.com/i5464539/0f5a63ffa5481624.jpg)
当我使用IDEA直接运行 app 模块中的Spring Boot应用时,新添加的代码得以运行:
![](https://img.haomeiwen.com/i5464539/84bf8ab692d10178.jpg)
可是,当我使用maven编译工具将项目打包成可运行 jar 时,,而且整个编译打包过程并未出错,却发现我方才新添加的代码并未运行:
打包:
mvn install
![](https://img.haomeiwen.com/i5464539/e0b59647dca2562f.jpg)
Terminal运行:
java -jar test.jar
![](https://img.haomeiwen.com/i5464539/8dea24af21427319.jpg)
发现问题
由于不懂maven的编译原理,所以只能以最笨的办法:不断测试不同的可能性,先Debug,排除代码错误的可能性。再修改 pom 插件、依赖等等。经过一个多小时的探索,终于:
我在使用maven打包时,选择的时 app 模块下的 install
。这种情况下,maven在打包时虽会对 项目下其他模块(core)进行编译、检测,但并不会对这些模块执行 install
命令。也就导致,除 app 模块以外的其他模块都处于之前的状态,app 模块打包时所copy的依赖文件也是之前的。
解决
其实解决方案很简单,那就是对整个项目执行编译打包即可。
![](https://img.haomeiwen.com/i5464539/b8f4a51fb44472be.jpg)
再在Terminals运行得到的结果:
![](https://img.haomeiwen.com/i5464539/63d661eef65048c4.jpg)
一些废话
这篇文章有点虎头蛇尾的感觉,但往往就是这样,最令人煎熬的无疑是找Bug的过程,往往最后问题很简单,解决方案更简单。希望看官有帮助。
网友评论