码迷,mamicode.com
首页 > 其他好文 > 详细

Maven构建分布式项目时子模块相互依赖打包技巧

时间:2021-06-17 16:45:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:方案   出错   conf   compile   lang   拷贝   mvn   特性   config   

场景

最近在学习使用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

Maven构建分布式项目时子模块相互依赖打包技巧

标签:方案   出错   conf   compile   lang   拷贝   mvn   特性   config   

原文地址:https://www.cnblogs.com/DJOSIMON/p/14891506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!