一、应用场景

一般情况下我们对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. Juc1024小半年总结-面试篇

    大家好,我叫Juc 这大概是我时隔2年度多 第一次以分享的形式发的第一篇公众号 今天是2019年10月26 本想在10月24就分享一下 可惜前面两天时间太忙... 很凑巧,今天我出来工作刚好满4个月, ...

  2. 百万年薪python之路 -- 小数据池和代码块练习

    1.请用代码验证 "alex" 是否在字典的值中? info = {'name':'王刚蛋','hobby':'铁锤','age':'18',...100个键值对} info = ...

  3. sublime设置 reindent 快捷键

    设置快捷键 使用快捷键 cmd + shift + p 打开控制面板 输入 key 关键词 点击进入 Key Bindings -User 添加如下代码 { "keys": [&q ...

  4. WORKGROUP无法访问,您可能没有权限使用网络资源,请与这台服务器的管理员联系以....

    解决方法 1.启用Guest账号 在很多情况下,为了本机系统的安全,Guest账户是被禁用的,这样就无法访问该机器的共享资源,因此必须启用Guest账户. 笔者以Windows XP系统为例进行介绍. ...

  5. Python+requests+unittest+excel实现接口自动化测试框架(摘录)

    一.框架结构:  工程目录 二.Case文件设计 三.基础包 base 3.1 封装get/post请求(runmethon.py) 1 import requests 2 import json 3 ...

  6. SpringBoot中教你手把手配置 https

    升级 https 记录 1.去阿里云购买证书(免费版),并提交审核资料 购买的证书 2.下载证书 下载证书 3.查看上图页面的第三步 JKS证书安装 4.在证书目录下执行阿里云提供的命令,密码都填 p ...

  7. .net调用阿里短信接口

    一.创建一个空的api项目 二.应用阿里的短信包 aliyun-net-sdk-core 三.登录阿里添加签名和模板 四.创建创建AccessKey 注意 AccessKey创建后,无法再通过控制台查 ...

  8. [springboot 开发单体web shop] 3. 用户注册实现

    目录 用户注册 ## 创建数据库 ## 生成UserMapper ## 编写业务逻辑 ## 编写user service UserServiceImpl#findUserByUserName 说明 U ...

  9. 《JavaScript设计模式与开发实践》-- 迭代器模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-diedaiqi/ 迭代器模式 1.定义 迭代器模式: 是指提供一种方法顺序访问一个聚合对象中 ...

  10. lua程序设计(一)

    摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...