SpringFramework

Spring Boot 多模块开发时,Maven编译可运行 ja

2019-04-16  本文已影响0人  我是才子

今天在干活时发现了 Maven 在对多模块打包时的一个小坑,做个记录,也希望能帮助到遇到相同问题的朋友。

我的项目结构如下:

image

project 为maven父项目,app、authorize、core为期子模块,app与authorize模块分别依赖core模块,app同时依赖authorize模块。project的pom.xml声明如下:

image

整个项目基于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):

image

当我使用IDEA直接运行 app 模块中的Spring Boot应用时,新添加的代码得以运行:

image

可是,当我使用maven编译工具将项目打包成可运行 jar 时,,而且整个编译打包过程并未出错,却发现我方才新添加的代码并未运行:

打包:

mvn install
image

Terminal运行:

java -jar test.jar
image

发现问题

由于不懂maven的编译原理,所以只能以最笨的办法:不断测试不同的可能性,先Debug,排除代码错误的可能性。再修改 pom 插件、依赖等等。经过一个多小时的探索,终于:

我在使用maven打包时,选择的时 app 模块下的 install 。这种情况下,maven在打包时虽会对 项目下其他模块(core)进行编译、检测,但并不会对这些模块执行 install 命令。也就导致,除 app 模块以外的其他模块都处于之前的状态,app 模块打包时所copy的依赖文件也是之前的。

解决

其实解决方案很简单,那就是对整个项目执行编译打包即可。

image

再在Terminals运行得到的结果:

image

一些废话

这篇文章有点虎头蛇尾的感觉,但往往就是这样,最令人煎熬的无疑是找Bug的过程,往往最后问题很简单,解决方案更简单。希望看官有帮助。

上一篇 下一篇

猜你喜欢

热点阅读