springboot 项目在 centos 中制作守护进程启动多配置文件项目的问题

葬天尘
  • 230

概述

我的 springboot 项目在 win 电脑开发打包为 jar 上传到 centos7 的腾讯云服务器。java 项目的配置文件如下
image.png
application.yml 的代码如下

spring:
  profiles:
#    active: dev,primarydb-dev,dbconfig-dev,shiro    # 测试服务器
#    active: dev,primarydb-dev,dbconfig-local,shiro  # 本地
    active: pro,primarydb,dbconfig,shiro            # 正式服务器

指定了使用多个配置文件。active 后面 pro 指定了使用 application-pro.yml 文件,primarydb 指定了使用 application-primarydb.ymldbconfig 指定了使用 application-dbconfig.ymlshiro 指定了使用 application-shiro.yml
打包 jar 并上传,通过下面的命令运行

nohup java -jar /usr/local/wxxxt/wxxxt.jar > /usr/local/wxxxt/runtime.log 2>&1 &

可以正常启动。之后在目录 /usr/lib/systemd/system 制作了守护进程 wxxxt.service,代码如下

[Unit]
Description=wxxxt # 服务描述,自定义
After=syslog.target
[Service]
Type=forking # 表示后台执行
# -DSERVICE_LOG_FOLDER 表示日志文件的存放路径
# --spring.config.location 表示使用的配置文件所在的路径
# 推荐使用外部配置文件的方式,万一端口号冲突方便修改
ExecStart=/usr/local/jdk1.8/jre/bin/java -DSERVICE_LOG_FOLDER=/usr/local/wxxxt -jar /usr/local/wxxxt/wxxxt.jar 
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

此后通过 systemctl start wxxxt.service 启动项目。测试通过

遇到的问题

进行测试时我将配置文件 application.yml 中测试服务器一行取消注释,并注释其他的行,然后打包上传进行测试。当要部署到正式服务器时,我又要到 application.yml 中通过取消注释的方法开放正式服务器的配置,然后打包上传。感觉很麻烦。

我的目标

我想要在 centos 的守护进程脚本中指定使用外部配置文件,即将 wxxxt.service 修改为如下

Type=forking # 表示后台执行
# -DSERVICE_LOG_FOLDER 表示日志文件的存放路径
# --spring.config.location 表示使用的配置文件所在的路径
# 推荐使用外部配置文件的方式,万一端口号冲突方便修改
ExecStart=/usr/local/jdk1.8/jre/bin/java -DSERVICE_LOG_FOLDER=/usr/local/wxxxt -jar /usr/local/wxxxt/wxxxt.jar  --spring.config.location=/usr/local/wxxxt/application.yml
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

同时将所有 application 开头的 yml 文件都拷贝到 centos7 的 jar 所在的同目录下
然后通过 systemctl start wxxxt.service 启动项目,但是项目没有成功启动并且 ssh 上没有任何提示。我要如何做才能指定使用外部配置文件启动该项目?

回复
阅读 186
1 个回答

我感觉最佳的方式应该是使用环境变量指定active的值来控制使用的配置文件,这样你就可以通过不同的变量启动不同的环境,连service文件也不需要每次更改了,你的项目为啥要分开那么多配置文件?集中成dev、test、prod三个配置文件不可以吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏