1、应用场景java
通常状况下咱们对springboot应用打包时使用springboot的maven插件spring-boot-maven-plugin的maven进行打包,打包完成获得一个fatjar,fatjar的优势是能够直接运行,缺点是体积太大,不利于传输,springboot应用打出来的fatjar体积少则几十M,多则上百M,在往服务器部署传输时十分便,可能只改了某个类文件,都须要从新将整个fatjar从新传输一次,特别是走公网传输的时候,可能上传速度只有几百甚至几十KB,而整个fatjar中真正咱们项目的代码文件可能也就几百KB或几兆的大小,因此有必要将fatjar中的依赖库与咱们项目的class进行分离打包,这样每次更换项目class就方便不少,而将配置文件也分离出来的缘由在于咱们可能常常须要更改配置文件的内容,若是放在fatjar中这样修改是很是不方便的,因此也须要将配置文件也分离出来。git
> fatjar 即将项目须要的全部依赖库及配置文件等打进一个jar或war,该文件可直接运行github
2、配置web
2.1 POM配置spring
下面对pom.xml进行配置,来实现分离打包,配置以下apache
<?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>lib/</classpathPrefix> <!-- jar包不包含惟一版本标识 --> <useUniqueVersions>false</useUniqueVersions> <!-- 指定入口类 --> <mainClass>cn.test.DemoApplication</mainClass> </manifest> </archive> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> <!-- 拷贝依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>true</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
关键配置说明:tomcat
(1) 去掉了spring-boot-maven-plugin打包插件springboot
(2) 添加 maven-jar-plugin (maven标准打包插件)服务器
(3) maven-dependency-plugin(依赖拷贝插件,主要用于将maven依赖库拷贝出来)app
插件具体的配置,pom.xml中已添加备注说明
2.2 打包
执行maven package 命令进行打包,获得的结果以下
将 lib目录 及 项目jar 文件拷贝到同一目录下,我为了测试方便,先所有拷贝到桌面上,(放置服务器上时也需保证在同一目录下)
打开demo-v1.2-release能够看到,并无将依赖jar打进来,大小只有不到4KB
2.3 config目录建立
以上作完还还须要将项目配置文件拷贝出来,在与jar包平级目录创建config目录,将项目中的application.properties或yaml文件拷贝进来
config 下的文件
通过以上步骤,所有配置完毕,下面进行一下简单的测试
3、测试
为了保证加载的是外部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端口
4、一点小坑
默认状况下window命令行打开后,是在当前用户目录下,像这样
而个人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都在同一目录下。
5、完整demo地址
https://github.com/yuboon/java-examples/tree/master/springboot-package-segment