(SpringBoot)Maven多模块项目打成Jar包发现依赖的子模块代码未及时更新

项目场景:

最近开发的一个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仓库和远程仓库。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值