一, 应用场景
一般情况下我们对 springboot 应用打包时使用 springboot 的 maven 插件 spring-boot-maven-plugin 的 maven 进行打包, 打包完成得到一个 fatjar,fatjar 的优点是可以直接运行, 缺点是体积太大, 不利于传输, springboot 应用打出来的 fatjar 体积少则几十 M, 多则上百 M, 在往服务器部署传输时十分便, 可能只改了某个类文件, 都需要重新将整个 fatjar 重新传输一次, 特别是走公网传输的时候, 可能上传速度只有几百甚至几十 KB, 而整个 fatjar 中真正我们项目的代码文件可能也就几百 KB 或几兆的大小, 所以有必要将 fatjar 中的依赖库与我们项目的 class 进行分离打包, 这样每次更换项目 class 就方便很多, 而将配置文件也分离出来的原因在于我们可能经常需要更改配置文件的内容, 如果放在 fatjar 中这样修改是非常不方便的, 所以也需要将配置文件也分离出来.
> fatjar 即将项目需要的所有依赖库及配置文件等打进一个 jar 或 war, 该文件可直接运行
二, 配置
2.1 POM 配置
下面对 pom.xml 进行配置, 来实现分离打包, 配置如下
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>chenyb</groupId>
- <artifactId>demo</artifactId>
- <version>v1.2-release</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.6.RELEASE</version>
- </parent>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <!-- springboot 打包插件 -->
- <!--
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <configuration>
- <mainClass>com.xx.xx</mainClass>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- -->
- <!-- maven 打包插件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
- <classpathPrefix}02${/outputDirectory>
- <overWriteReleases>true</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- <overWriteIfNewer>true</overWriteIfNewer>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
关键配置说明:
(1) 去掉了 spring-boot-maven-plugin 打包插件
(2) 添加 maven-jar-plugin (maven 标准打包插件)
(3) maven-dependency-plugin(依赖拷贝插件, 主要用于将 maven 依赖库拷贝出来)
插件具体的配置, pom.xml 中已添加备注说明
2.2 打包
执行 maven package 命令进行打包, 得到的结果如下
将 lib 目录及 项目 jar 文件拷贝到同一目录下, 我为了测试方便, 先全部拷贝到桌面上,(放置服务器上时也需保证在同一目录下)
打开 demo-v1.2-release 可以看到, 并没有将依赖 jar 打进来, 大小只有不到 4KB
2.3 config 目录创建
以上做完还还需要将项目配置文件拷贝出来, 在与 jar 包平级目录建立 config 目录, 将项目中的 application.properties 或 YAML 文件拷贝进来
config 下的文件
经过以上步骤, 全部配置完毕, 下面进行一下简单的测试
三, 测试
为了保证加载的是外部 config 目录的配置文件, 我将 application-test.YAML 中的 server.port 改为 8085, 打开命令行输入
C:\Users\Administrator\Desktop>java -jar -Dspring.profiles.active=dev -Dspring.location.config=config/ C:\Users\Administrator\Desktop\demo-v1.2-release.jar
回车运行, 能正常启动说明外部依赖可以正常加载进来
可以看到启动完成后 tomcat 监听端口为 8085, 说明外部配置加载成功.
PS : 如果外部配置文件加载失败, 会使用项目 jar 中的配置文件, 如下图, 也就是启动后会是 8080 端口
application-dev.YAML 中配置的端口是 8080
而我已将外部 config 目录下 application-dev.YAML 中端口做了修改, 使用外部配置文件启动后会是 8085 端口
四, 一点小坑
默认情况下 Windows 命令行打开后, 是在当前用户目录下, 像这样
而我的 config,lib, 项目 jar 拷贝在桌面上, 实际路径是
一开始我在 C:\Users\Administrator> 直接执行下方命令, 一直加载不到配置文件
java -jar -Dspring.profiles.active=dev -Dspring.location.config=config/ C:\Users\Administrator\Desktop\demo-v1.2-release.jar
原因就在于程序与配置文件不在同一目录下, 我在 C:\Users\Administrator > 运行启动命令, 而程序实际目录在 C:\Users\Administrator\Desktop> 下, 因为程序使用了绝对路径, 可以找到文件, 所以程序的实际运行路径为 C:\Users\Administrator\Desktop, 而我使用的配置 spring.location.config=config/ 使用的是相对路径,, 这个相对路径又是相对 C:\Users\Administrator> 目录, 所以就会出现找不到配置文件的情况.
解决办法一:
命令行切换到 C:\Users\Administrator\Desktop 目录, 即项目 jar 所在目录, 运行 java -jar 命令
解决办法二:
将 config 拷贝到 C:/Users/Administrator 下, 保证 C:/Users/Administrator 相对路径下存在 config 目录及配置文件 (该方法可解决问题, 但是不建议)
解决方法三:
spring.location.config=config/ 处使用绝对路径, 即 C:/Users/Administrator/Desktop/config/
所以很重要一点, 一定保证 执行命令 的目录 与项目 jar,lib,config 都在同一目录下.
五, 完整 demo 地址
https://github.com/yuboon/java-examples/tree/master/springboot-package-segment
来源: https://www.cnblogs.com/yuboon/p/11919329.html