SpringBoot多模块打包过程问题解析及处理方式

项目结构

  • 模块主要分为parent父模块、common公共组件模块、service项目服务模块(web入口模块)

SpringBoot多模块打包过程问题解析及处理方式文章插图
整体思路
  • 梳理引入依赖逻辑 , 防止重复引入
  • 处理打包过程中遇到的问题
1、先看项目结构中是否存在重复引入依赖或者依赖逻辑混乱的情况以我的项目为例:
在common_base(基础组件模块)中已经引入了对于工具模块的依赖 , 在service模块引入依赖时就只需要引入common_base即可 , 防止对common_utils的二次依赖 , 导致后续引入依赖时逻辑混乱的情况;
建议在做多模块开发是设计好引入依赖的逻辑结构 , 清晰的引入规则可以有效规避掉很多打包过程中的问题 。
SpringBoot多模块打包过程问题解析及处理方式文章插图
SpringBoot多模块打包过程问题解析及处理方式文章插图
2、打包过程中遇到的问题分析及解决方式总结问题一:repackage failed: Unable to find main class
SpringBoot多模块打包过程问题解析及处理方式文章插图
【SpringBoot多模块打包过程问题解析及处理方式】原因:出现该问题的原因是模块中引入了spring-boot-maven-plugin , 打包的时候它去寻找SpringBoot的启动类 , 但它没有找到 , 所以打包失败 。
解决:
方法一: 直接将pom中的spring-boot-maven-plugin相关代码删除
这种方法对于我的项目来说不推荐 , 因为common_base的pom文件中是没有引入spring-boot-maven-plugin的 , 而是继承自父模块的pom文件 , 我需要将父模块的spring-boot-maven-plugin重复引入到其他子模块中 。
方法二: 通用解决办法:下配置mainClass , 指定程序入口
我的项目中有基础服务模块 , 所以只需要将工具模块的启动程序挂在到基础服务模块的启动类上即可 。
  • org.springframework.boot spring-boot-maven-plugin cn.ncepu.service_bases.BasesApplication repackage
方法三: 如果你的pom继承自spring-boot-starter-parent(注意此前提) , 也可以直接在配置(其实这里的start-class直接对应清单文件里的Start-Class):com.xx.webapps.api.main.WebappsApiBidMain问题二:springboot多模块打包报错 , 找不到common包 , 找不到工具类此问题为偶发性问题 , 会出现偶尔可以打包成功 , 偶尔打包报错的情况
  • 问题分析:service_bases模块打包的时候 , 找不到common_util公共组件模块的包 , 找不到common_util公共组件模块的类
  • 原因:1、common_util不能添加spring-boot-maven-plugin插件 , 如果添加了spring-boot-maven-plugin , 当运行maven的package打包命令时 , 这个SpringBoot插件会在Maven的package后进行二次打包 , 目的是生成可执行jar包;2、二次打包后其他模块引用common_util模块就会报错找不到common包 , 找不到工具类错误
解决:
方法一:common子项目模块 , 只加如下插件
org.apache.maven.pluginsmaven-resources-pluginUTF-8 方法二: 子项目如果要打包 , 也可以使用maven-jar-plugin打包工具
org.apache.maven.plugins maven-jar-plugin
SpringBoot多模块打包过程问题解析及处理方式文章插图
打包成功
后记在打包结束之后我检查了一下打包后的jar包 , 发现除了打包好的jar包之外 , 还有一个.original文件 。
SpringBoot多模块打包过程问题解析及处理方式文章插图
这个文件有什么用?
.jar.original 是普通jar包 , 不包含依赖;是上一次打包的备份文件.jar 是可执行jar包 , 包含了pom中的所有依赖 , 可以直接用java -jar 命令执行;
官方文档:…
可以用jar tvf target/xxx-0.0.1-SNAPSHOT.jar.original查看文件内容 。
可以看出original文件只包含少量用户的类 , 不包含依赖 。 如果包含依赖的.jar叫 fat jar, 那这个就是瘦jar了 。
Spring Boot Maven plugin的5个Goals: