1 如何将SpringBoot应用的配置文件挂到jar包外面
在 SpringBoot 应用中,可以将配置文件放在 jar 包外面,这样可以方便地修改配置而不需要重新打包和部署。
1.1 使用命令行参数
在启动应用程序时,可以使用--spring.config.location
或-Dspring.config.location
命令行参数来指定配置文件的路径。
例如:(config 后面的 / 不可省略)
java -jar springboot-demo.jar --spring.config.location=/opt/servers/config/
1
补充:FHS(Filesystem Hierarchy Standard 文件系统层次化标准)将/opt定义为 “为安装附加应用软件包而保留”。所以这里选择/opt
文件夹来存放应用程序的配置文件。
1.2 使用环境变量
可以设置SPRING_CONFIG_LOCATION
环境变量来指定配置文件的路径。
如:
export SPRING_CONFIG_LOCATION=/opt/app/config/
java -jar springboot-demo.jar
1.3 使用外部配置文件
方法一
在应用程序(jar包)启动命令执行目录下创建一个名为config
的文件夹,然后将配置文件放在该文件夹中。
方法二
在应用程序(jar包)同级目录下创建一个名为config
的文件夹,然后将配置文件放在该文件夹中。在代码的配置文件application.properties
或application.yml
中添加以下项:
spring.config.name=application
spring.config.location=classpath:/,file:./config/
方法三
在应用程序(jar包)同级目录下直接放properties或yml配置文件。
方法四
在应用程序(jar包)内部的classpath的同级目录下,创建config文件夹,然后放properties或yml配置文件。
方法五
在应用程序(jar包)内部的classpath的同级目录下,然后直接放properties或yml配置文件。
注意:以上方法可以组合使用,例如,可以在命令行参数和环境变量中同时指定配置文件的路径,执行时命令行参数的优先级最高。
2 SpringBoot 配置文件生效的优先级排序
java -jar
命令行中,通过--spring.config.location
参数指定的方式优先级最高。设置
SPRING_CONFIG_LOCATION
环境变量来指定配置文件的路径是次优先级。在执行
java -jar
命令同级目录下的config
文件夹是第三优先级。
注意:如果java -jar
命令不是在项目jar包同级目录执行的话,在项目jar包同级目录下的 config 文件夹是不生效的。
项目jar包中properties或yml文件中指定
spring.config.location
配置文件夹是第四优先级。项目jar包同级下直接放properties文件是第五优先级,直接把配置文件放到jar包的同级目录。
项目内部的classpath同级config文件夹是第六优先级,在 classpath下建一个config文件夹,然后把配置文件放进去。
项目内部的classpath同级放properties文件是最低优先级,是在classpath下直接放配置文件。
SpringBoot默认是优先读取java -jar
命令同级目录下的一个config/application.properties
文件的。
在项目内src/main/resources
文件夹下创建的application.properties文件的优先级是最低的。
3. docker-compose 编排 springboot
3.1 安装docker-compose
下载
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
授权
chmod +x /usr/local/bin/docker-compose
3.2 部署springboot应用
创建目录
mkdir -p /opt/servers/config/
上传jar包
cd /opt/servers/
rz springboot-demo-1.0.jar
删除配置
cd /opt/servers/config/
rz application.yml
rz application-dev.yml
新建Dockerfile文件
进入目录
cd /opt/servers/
Dockerfile文件内容
FROM openjdk:8-jre
RUN mkdir -p /opt/servers/config/
RUN echo 'Asia/Shanghai' >/etc/timezone
COPY ./springboot-demo-1.0.jar /app/springboot-demo-1.0.jar
ENV IS_MASTER true
ENTRYPOINT ["sh","-c","java -XX:+UseG1GC -Xms128M -Xmx512M -XX:SurvivorRatio=8 -Djava.security.egd=file:/dev/./urandom -jar /opt/servers/springboot-demo-1.0.jar --spring.config.location=/opt/servers/config/"]
创建docker-compose.yml文件
进入目录
cd /opt/servers/
docker-compose.yml内容
version: "3"
services:
springboot_demo:
build: .
restart: unless-stopped
environment:
- SPRING_PROFILES_ACTIVE=dev
- SERVER_PORT=8080
volumes:
- /home/log:/data/log
- /opt/servers/config/:/opt/servers/config/
ports:
- 7082:7082
container_name: springboot-demo
启动脚本startup.sh
#!/bin/bash
docker-compose stop springboot_demo
docker-compose rm -f springboot_demo
docker rmi servers-springboot_demo
docker-compose up -d springboot_demo
关闭脚本shutdown.sh
#!/bin/bash
docker-compose stop springboot_demo
docker-compose rm -f springboot_demo
docker rmi springboot_demo
springboot服务最终部署目录结构
[root@test-002 servers]# pwd
/opt/servers/
[root@test-002 servers]# tree
.
├── springboot-demo-1.0.jar
├── config
│ ├── application-dev.yml
│ └── application.yml
├── docker-compose.yml
├── Dockerfile
├── shutdown.sh
└── startup.sh
查看日志
docker-compose logs -f
进入容器内容
docker exec -it springboot-demo /bin/sh