当前位置: 代码迷 >> 综合 >> maven 多模块 相互依赖 打jar包流程及注意事项
  详细解决方案

maven 多模块 相互依赖 打jar包流程及注意事项

热度:74   发布时间:2023-10-10 05:04:17.0
  1. 创建maven多模块项目,编写代码,添加子模块相互依赖;
  2. 举例来说,父项目为cloud-maven-learn,子项目为learn-server(springcloud 的服务治理和服务发现项目,集成eureka),learn-product(springcloud业务模块项目,产品项目,集成ribbon和feign),learn-user(springcloud业务模块项目,用户项目,集成ribbon和feign);
  3. 可以使用如下代码添加子模块之间的依赖:
<dependency><groupId>com.jianxin</groupId><artifactId>learn-user</artifactId><version>${project.version}</version>
</dependency>
  1. 打包,首先打包learn-server项目,因为此项目为服务治理项目,其他项目打包时会TESTS,测试运行,会向该项目注册;
  2. 打包时,learn-server的pom中添加如下build依赖:
<packaging>jar</packaging><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
  1. maven窗口—clean—package,即可在target中找到打好的jar包。可以在cmd窗口中,使用java -jar learn-server.jar来运行项目。
  2. 然后打learn-product和learn-user项目为可运行的jar包,因为learn-product依赖learn-user项目,所以在打learn-product包之前,需要先将learn-user项目安装到本地maven仓库中。具体步骤为:
    7.1 在父项目cloud-maven-learn中clean,清理所有项目中的编译文件;
    7.2 在父项目cloud-maven-learn的pom中添加如下打包插件,并通过modules将子项目组织起来:
<modules><!-- 服务发现和治理模块 --><module>learn-server</module><!-- 产品服务模块 --><module>learn-product</module><!-- 用户服务模块 --><module>learn-user</module>
</modules><build><plugins><!-- maven 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven.compiler.plugin.version}</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins>
</build>

7.3 注销learn-user项目中spring-boot-maven-plugin打包插件:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

7.4 点击learn-user的maven窗口的install,安装成功即可,并查看本地maven仓库是否有了learn-user相应的jar包;
7.5 如果learn-user安装install正常,点击learn-product项目maven窗口的package,进行打包,注意此时learn-product项目的pom中需要有spring-boot-maven-plugin的打包插件,此时learn-product项目打包成功,其jar包内部含有learn-user的jar包依赖。
8. 如果需要将learn-user项目打包为可执行jar包,需要在learn-user项目的pom中添加spring-boot-maven-plugin的插件依赖,然后clean—package,即可获得可运行的jar包。如果lean-user依赖于其他项目(如learn-product),在lean-user打包时,需要按第7点,先把被依赖项目(如learn-product)的spring-boot-maven-plugin的插件进行注销,install到本地仓库,lean-user再去package才可以。
9. 总结一下:
9.1 maven多模块项目打包,需要在父项目中添加:

<build><plugins><!-- maven 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven.compiler.plugin.version}</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins>
</build> 

9.2 子项目如果没有依赖,添加如下插件,进行clean—package:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

9.3 子项目之间有依赖,需要先把被依赖项目注销掉spring-boot-maven-plugin,install安装到本地maven仓库,然后依赖的项目进行clean —package;被依赖项目本身打可运行jar包,需要添加spring-boot-maven-plugin插件才可以。
10. 项目示例见:https://gitee.com/manongfaner/cloud-maven-learn
2021.10.09 续
11. 如果报错为 IllegalState Found multiple @SpringBoot… 类似信息,理解为,依赖模块中,有多个@SpringbootApplication ,解决方式有:可以把@SpringBootTest 注解类注销掉,再重新install。
12. 如果报错为:Could not find artifact com.xxx.xxx:父项目名:pom:1.0-SNAPSHOT ,也就是没有发现父模块的jar包,可以在右侧maven窗口—》父模块项目—》Lifecycle—>clean---->install ,也就是安装父模块。
13. 安装父模块过程中如果报错为,无法找到符号,无法找到包com.xxx.xxx.service等类似的报错,在使用了feign的前提下,考虑feign对打包的影响,可以将feign依赖模块中的service接口类,转义到其他模块中,如果common模块(common模块依赖feign即可)。
14. 再次clean—》install,即可成功安装父模块 (父项目名称)。
15. 安装成功父模块后,再重新尝试安装子模块,如gateway模块,即可,安装过程中,参考以上第7点添加maven编译插件和注销相关插件。