Maven构建分布式项目时子模块相互依赖打包技巧
场景#
最近在学习使用Jenkins自动化部署分布式微服务的时候,需要将微服务打成Jar包发送到服务器制作成镜像供Jenkins拉取运行,了解到 spring-boot-maven-plugin
插件可以完成Maven工程的打包任务。
问题#
直接在父pom文件引入如下插件将会导致Maven打的微服务Jar包不会将外部依赖导入其中,且其他模块在依赖本模块的时候可能出现找不到类的报错。即无法通过 java -jar xxx.jar
命令来启动服务。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
原因#
spring-boot-maven-plugin
打出来的Jar包默认是不可依赖的,需要进行一些额外的配置。
比如一个微服务工程中,往往会抽取出来一个 common
公共模块,在 common
公共模块中使用了 spring-boot-maven-plugin
的默认配置build,其他依赖了 common
模块的比如 provider
或者 order
在使用打包命令进行打包时就会出错,错误是在 provider
或者 order
中找不到 common
中的类,原因就是此插件默认默认打包出来的Jar是不可依赖的。
解决方案#
在父工程pom文件和公共模块pom文件做一些修改
<!-- 父pom -->
<build>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- Java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- maven打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- common pom -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 这个属性为可执行jar包的名字后缀 -->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
<!-- 其余子模块会继承父模块 -->
配置完后在进行 mvn clean package
或者 mvn clean install
命令打包服务后,可用 java -jar xxx.jar
正常启动。
其他细节#
在使用 spring-boot-maven-plugin
插件进行打包操作的时候强烈建议指明JDK版本,不然可能在使用了一些Java8新特性的时候可能受到类似不识别Lambda,请使用Resource8这样的错误。
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
原文参考:
https://blog.csdn.net/DamonREN/article/details/85091900
作者: 溫柔の風
出处:https://www.cnblogs.com/DJOSIMON/p/14891506.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现