场景 最近在学习使用Jenkins自动化部署分布式微服务的时候,需要将微服务打成Jar包发送到服务器制作成镜像供Jenkins拉取运行,了解到 spring-boot-maven-plugin
插件可以完成Maven工程的打包任务。
问题 直接在父pom文件引入如下插件将会导致Maven打的微服务Jar包不会将外部依赖导入其中,且其他模块在依赖本模块的时候可能出现找不到类的报错。即无法通过 java -jar xxx.jar
命令来启动服务。
1 2 3 4 5 6 7 8 <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文件做一些修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <build > <plugins > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-resources-plugin</artifactId > <configuration > <encoding > UTF-8</encoding > </configuration > </plugin > <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 > <plugin > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-maven-plugin</artifactId > <executions > <execution > <goals > <goal > repackage</goal > </goals > </execution > </executions > </plugin > </plugins > </build > <build > <plugins > <plugin > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-maven-plugin</artifactId > <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这样的错误。
1 2 3 4 5 <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