项目场景:
最近开发的一个SpringBoot的Maven多模块项目(模块之间有主从依赖关系),本地进行开发的时候,不管改动哪个模块的代码,本地启动项目访问都能看到修改的效果;但是由于项目上线需求,最终会把主模块(A)打成Jar包在服务器进行部署。
1.项目结构描述:Parent模块有四个子模块,分别为A(Web)、B(Controller)、C(Service)、D(Common)。现在只有A模块保留启动类(其实也就是主模块),A模块的pom文件依赖了B模块,B模块的pom文件依赖了C和D模块,C模块的pom文件依赖了D模块,以上就是ABCD等四个同级模块大致依赖关系。
2.项目部署描述:最终项目部署是把A模块直接打成Jar包进行部署(根据依赖关系,通过解压Jar包发现被依赖同级模块也会以jar包的方式关联进去,其实也就是一个完整的项目)。
3.项目结构图:
4.各模块Pom文件:
A.x-manage-app(Parent)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
//项目结构代码展示
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
//Parent的名称
<artifactId>manage-app</artifactId>
//打包模式为pom
<packaging>pom</packaging>
<modules>
//A模块
<module>x-manage-app-web</module>
//B模块
<module>x-manage-app-controller</module>
//C模块
<module>x-manage-app-service</module>
//D模块
<module>x-manage-app-common</module>
</modules>
//其它配置此处省略。。。。。
</project>
B.x-manage-app-web(A)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
//当前模块名称
<artifactId>x-manage-app-web</artifactId>
//打成jar包
<packaging>jar</packaging>
//依赖的模块
<dependencies>
<dependency>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app-controller</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
//打完jar的包名
<finalName>*-manage</finalName>
</plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
//启动类所处位置
<configuration>
<mainClass>com.*.*.manage.MApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
//其它配置此处省略。。。。。
</project>
C.x-manage-app-controller(B)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
//当前模块名称
<artifactId>x-manage-app-controller</artifactId>
//依赖模块
<dependencies>
<dependency>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
//其它配置此处省略。。。。。
</project>
D.x-manage-app-service(C)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
//当前模块名称
<artifactId>x-manage-app-service</artifactId>
//依赖模块
<dependencies>
<dependency>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
//其它配置此处省略。。。。。
</project>
E.x-manage-app-common(D)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.*.manage</groupId>
<artifactId>x-manage-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
//当前模块名称
<artifactId>x-manage-app-common</artifactId>
//其它配置此处省略。。。。。
</project>
问题描述:
根据依赖关系,部署时把A模块打成Jar包进行部署,发现问题来了:修改了Controller、Service、Common等模块的代码,如果直接在x-manage-app-web(A)项目上打Jar(IDEA开发工具中 clean-install 即可打成Jar包),发现打成的Jar包里面依赖进来的Controller/Service/Common等模块Jar包的修改代码是没有及时更新进来。
提示:通过解压打成的Jar,获取对应的class文件,拖进IDEA中进行反编译即可查看你修改的代码是没有及时更新过来的。
原因分析:
在主模块x-manage-app-web(A)上打包时获取的x-manage-app-controller(B)模块的依赖包是从本地Maven仓库获取之前install的包,因此只是修改代码并没有把x-manage-app-controller(B)模块重新打包,本地Maven仓库对应的Jar包是不会被更新的。
解决方案:
方法一:不管B(Controller)/C(Service)/D(Common)这三个模快哪个有改动,就得在改动的模块执行clean-->install操作一下,这样再用A(Web)主模块打包的时候,被依赖进来的就是被更新的Jar包了。
方法二:使用A(Web)主模块打包的时候之前,都先对Parent(父)模块clean-->install操作一下,这样它所有的子模块都会重新打包一次,此操作相当于分别对每个子模块执行clean-->install操作一下。
温馨提示:
1.IDEA开发工具的clean-->install操作地方,如下图所示:
2.如果执行某个模块clean-->install失败,可能就是被依赖的模块修改代码没有clean-->install,针对这种情况,只用找到对应的依赖模块执行clean-->install操作一下,成功后再对先前失败的模块重新clean-->install即可。
3.Maven中clean、install、deploy这三个命令作用是:A.clean删除项目模块下target目录;B.install命令完成了项目编译/单元测试/打包功能,同时可执行jar包布署到本地maven仓库,但没有布署到远程仓库;C.deploy命令完成了项目编译/单元测试/打包功能,同时把可执行jar包布署到本地maven仓库和远程仓库。