SpringBoot --spring.profiles.active相关问题

springboot配置文件

  1. springboot支持yml或者properties两种方式
  2. 无论是哪种方式,都可以指定activeprofiles
    profiles官方文档
  3. spring支持在application.properties中直接配置数据库连接。
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=test
spring.datasource.password=test12345
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  1. 当我们开发功能的时候,区分本地测试,测试服务器,正式上线的服务器,分别为dev,qa,prod
  2. 很重要的一点是,这三个环境的数据库的密码并不一样,因此如果你每次都重新修改数据库的配置,然后再重新出版本,会很麻烦,因为代码并没有变化,只不过环境变了

因此springboot,支持active的指向

也支持命令行的方式修改java -jar test.jar --spring.profiles.active=prod

profiles支持多个active

在版本稍微高一点点的springboot中,都是支持多个active的profiles的
spring.profiles.active=dev,qa
多个的规则是,靠后的会覆盖在前面的配置
比如devqa的properties里面,都有spring.datasource.password
你的本地dev里面是dev12345,而qa上是qa12345
如果qa是在,后面,那么qaspring.datasource.password就会覆盖dev里面的密码,所以会使用qa里面的密码。

profiles支持外部文件

假设项目内,只有两个properties文件,一个是本地调试的,一个是release到正式服务器上的文件。
properties
则在自己公司是可以这么设置的,并且可以顺利运行的。
但如果要把该工程,分发给客户的环境上运行,就会有问题了,因为客户的环境是千奇百怪的。
除非要求客户的环境和各种配置,跟我们的正式服务器一模一样,否则就会出现各种密码错误,最突出的就是客户的数据库密码想要自己设置。这样我们的配置文件不够用了,直接在外部配置一个properties,里面把所有客户想要自己设置的属性,都写上,然后放在后面,覆盖我们本身的prod或者dev
外部properties
java -jar test.jar --spring.profiles.active=prod,ext运行,就会读取application-ext.properties中的内容了,并且级别比prod中的高,所以即使war内的properties的值是自己本地的值,也不要紧,只需要在外部的配置文件中修改就行。

centOS7服务器上运行springboot问题

服务需要开机启动

自己写一个service固然可以,但是一般还是用supervisor来管理jar包。
因此自己将服务写在了supervisor的外部文件中,即:开启include

[include] 
files = supervisord.d/*.ini    ;可以指定一个或多个以.ini结束的配置文件

supervisord.d文件夹下面,我新建了一个javatest.ini文件。

[program:test]
command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active=prod,ext --server.port=8080
autostart=true
startsecs=10
autorestart=false
startretries=3
user=root
priority=999
redirect_stderr=false
stdout_logfile_maxbytes=10MB
stdout_logfile_backups = 20
stdout_logfile=/opt/test/logs/java8080.out
stderr_logfile=/opt/test/logs/java8080err.out
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=20
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
stopasgroup=false
killasgroup=false

使用supervisor来管理我们的服务,是它可以开机启动。

数据库连接不上

但运行了之后,还是会提示DB连接错误,看了一下错误信息
java.sql.SQLException: Access denied for user 'aaaaaaa'@'localhost' (using password: YES)
明明在application-ext.properties中修改了数据库的用户名和密码,为什么用的还是prod中的用户名呢?

分析

  1. javatest.ini文件没有写对
    自己查看了supervisor官方文档,里面有解释,在command里面,带参数的,有时候需要用""包起来才行,结果改成command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active="prod,ext" --server.port=8080也还是不行。

  2. 分析入参
    自己在WebApplicationmain方法中,将所有入参都打印出来,发现入参并没有问题。

  3. 怀疑先后顺序问题
    于是使用了spring.profiles.include,修改command:

command=/usr/bin/java -Xms128m -Xmx256m -jar /opt/test/test.war --spring.profiles.active=ext --spring.profiles.include=prod --server.port=8080

发现依然报错,这个时候,忽然想到,有可能是没有发现properties文件
于是在supervisord.conf的同级目录下面,将application-ext.properties文件复制到该文件夹。
发现一切正常。

结论

--spring.profiles.active=prod,ext中的prodext,spring会去寻找application-prod.propertiesapplication-ext.properties包括war包内,和运行脚本的那个目录下面,而不是war存放的目录下。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页