SpringBoot 配置文件与依赖库分离打包配置
一、应用场景
一般情况下我们对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>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>
关键配置说明:
(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端口
四、一点小坑
默认情况下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都在同一目录下。
五、完整demo地址
https://github.com/yuboon/java-examples/tree/master/springboot-package-segment
SpringBoot 配置文件与依赖库分离打包配置的更多相关文章
- SpringBoot——配置文件加载位置及外部配置加载顺序
声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...
- Springboot配置文件参数使用docker-compose实现动态配置
文章总结; Springboot配置文件中的一些参数可以写成变量的形式,具体变量的值可以从docker-compose.yml文件中设置来获取 在yml文件中,通过${Envirment_variab ...
- CocoaPods为多个target添加依赖库/Podfile的配置
Podfile的相关配置,请看官方文档http://guides.cocoapods.org/syntax/podfile.html 1)多个target公用相同库,还可以添加额外的不同第三方库 编辑 ...
- SpringBoot 配置文件以及依赖 加上跨域配置文件
配置目录: application.properties的配置 #设置服务端口号 server.port = 8090 #配置数据源 spring.datasource.driver-class-na ...
- SpringBoot原理深入及源码剖析(一) 依赖管理及自动配置
前言 传统的Spring框架实现一个Web服务需要导入各种依赖jar包,然后编写对应的XML配置文件等,相较而言,SpringBoot显得更加方便.快捷和高效.那么,SpringBoot究竟是如何做到 ...
- SpringBoot 整合 MyCat 实现读写分离
MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成Sp ...
- 网络爬虫技术实现java依赖库整理输出
网络爬虫技术实现java依赖库整理输出 目录 1 简介... 2 1.1 背景介绍... 2 1.2 现有方法优缺点对比... 2 2 实现方法... 2 ...
- 【转】python导出依赖库
原文链接:https://www.cnblogs.com/ceshixuexi/p/8283372.html 在Python开发的过程中,经常会遇到各种各样的小问题,比如在一台计算机上调试好的程序,迁 ...
- SpringBoot打包实现静态文件、配置文件、jar包分离
在pom文件里面添加 <plugins> <!--定义项目的编译环境--> <plugin> <groupId>org.apache.maven.plu ...
随机推荐
- c语言1博客作业02
c语言1博客作业02 这个作业属于哪个课程 C语言程序设计 这个作业的要求在哪 [作业要求](https://edu.cnblogs.com/campus/zswxy/SE2019-2/homewor ...
- MyBatis(2)-- MyBatis配置mybatis-config.xml
一.properties属性 1.可以在mybatis-config.xml中使用property子元素配置 <properties resource="jdbc.properties ...
- Java基础(二)数据类型
数据类型主要分为基本类型和引用类型两大类. 一.基本类型 1.基本类型又分为数值类型和boolean类型, (1)数值类型包括浮点数类型.整数类型和字符类型 整型 ...
- (四)Trigger
在游戏物体上可以添加Trigger组件,它与unity的eventTrigger类似,但功能更复杂详细. 在游戏物体上田间Trigger,并通过add new event来添加相关功能,如下图所示,添 ...
- unity 基于scrollRect实现翻页显示
unity 基于scrollRect实现翻页显示,并定为到某一页,而不是某一页的中间方法(第二个脚本采用实际位置计算,并在update里实现平滑过渡): 组场景时,经常需要获取鼠标(或者点击)开始结束 ...
- vue 踩坑--项目名称不能与插件名称一样
今天webpack搭建,命令行一直报错 百度说是项目名称为:vue npm 拒绝安装 后来才发现是 package.json的name名称也设成了vue 所以 修改一下就可以了.
- JS旋转和css旋转
js旋转 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <styl ...
- day3------基本数据类型int, bool, str,list,tuple,dict
基本数据类型(int, bool, str,list,tuple,dict) 一.python基本数据类型 1. int 整数. 主要用来进行数学运算 2. str 字符串, 可以保存少量数据并进 ...
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...
- Centos7 基础命令与软件的安装
本人小白一枚正在老男孩培训,所以从现在开始把我学到的知识都分享给大家,该随笔会一直更新 centos7基础命令与软件 ps:命令与参数之间必须加上空格,安装成功时最后一行会有 Complete! ...