一、应用场景

一般情况下我们对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 配置文件与依赖库分离打包配置的更多相关文章

  1. SpringBoot——配置文件加载位置及外部配置加载顺序

    声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...

  2. Springboot配置文件参数使用docker-compose实现动态配置

    文章总结; Springboot配置文件中的一些参数可以写成变量的形式,具体变量的值可以从docker-compose.yml文件中设置来获取 在yml文件中,通过${Envirment_variab ...

  3. CocoaPods为多个target添加依赖库/Podfile的配置

    Podfile的相关配置,请看官方文档http://guides.cocoapods.org/syntax/podfile.html 1)多个target公用相同库,还可以添加额外的不同第三方库 编辑 ...

  4. SpringBoot 配置文件以及依赖 加上跨域配置文件

    配置目录: application.properties的配置 #设置服务端口号 server.port = 8090 #配置数据源 spring.datasource.driver-class-na ...

  5. SpringBoot原理深入及源码剖析(一) 依赖管理及自动配置

    前言 传统的Spring框架实现一个Web服务需要导入各种依赖jar包,然后编写对应的XML配置文件等,相较而言,SpringBoot显得更加方便.快捷和高效.那么,SpringBoot究竟是如何做到 ...

  6. SpringBoot 整合 MyCat 实现读写分离

    MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成Sp ...

  7. 网络爬虫技术实现java依赖库整理输出

    网络爬虫技术实现java依赖库整理输出 目录 1       简介... 2 1.1      背景介绍... 2 1.2      现有方法优缺点对比... 2 2       实现方法... 2 ...

  8. 【转】python导出依赖库

    原文链接:https://www.cnblogs.com/ceshixuexi/p/8283372.html 在Python开发的过程中,经常会遇到各种各样的小问题,比如在一台计算机上调试好的程序,迁 ...

  9. SpringBoot打包实现静态文件、配置文件、jar包分离

    在pom文件里面添加 <plugins> <!--定义项目的编译环境--> <plugin> <groupId>org.apache.maven.plu ...

随机推荐

  1. markdown数学公式大全

    目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...

  2. ANSI最全介绍linux终端字体改变颜色等

    ANSI转义序列 维基百科,自由的百科全书 由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此博客,方便国内用户参考,原地址(https://zh.wik ...

  3. Redis学习四(运维指南).

    一.上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性. redis 的运行机器 CPU 不求核数多,但求主频高 ...

  4. SQL挑战一 : 查找最晚入职员工的所有信息

    以上数据库表: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_nam ...

  5. JVM(6) 字节码执行引擎

    编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载 ...

  6. Unity调用Android

    1.Unity调用Android 根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解. 2.Unity获取android类 ...

  7. 设计时需要考虑的问题(webAPI)

    1.根据api接口访问路径定义好controller和action. 2.记录操作日志.包含接口入参.出参.异常以及重要的节点数据(数据库返回.第三方接口返回.重要的私有变量值) 3.入参合法性检查. ...

  8. Spring Cloud alibaba网关 sentinel zuul 四 限流熔断

    spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架 Sentinel 介绍 官方网址 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentine ...

  9. 《大数据实时计算引擎 Flink 实战与性能优化》新专栏

    基于 Flink 1.9 讲解的专栏,涉及入门.概念.原理.实战.性能调优.系统案例的讲解. 专栏介绍 扫码下面专栏二维码可以订阅该专栏 首发地址:http://www.54tianzhisheng. ...

  10. MySQL查询-分组取组中某字段最大(小)值所有记录

    最近做东西的时候,用到一个数据库的查询.将记录按某个字段分组,取每个分组中某个字段的最大值的所有记录.举栗子来说. 已知分数表“score”,包含字段“id", "name&quo ...