gpt4 book ai didi

java - 从 bash 脚本中将 Spring Boot 作为前台进程启动

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:04 24 4
gpt4 key购买 nike

我用嵌入式 Tomcat servlet 容器打包我的 Spring Boot war。并使用 java -jar server.war <Spring Args> 将其部署为常规 Java 应用程序.我写了一个 bash 脚本,负责将服务器部署为后台/前台进程:

start_foreground() {
cmd="$JAVACMD ${JVM_OPTS} -jar ${WAR_FILE} ${SPRING_OPTS}"
echo "\"${cmd}\""
eval ${cmd}
print_log "Server is stopped."
}

start_background() {
SPRING_OPTS="--spring.pid.file=${PID_FILE} ${SPRING_OPTS}"
cmd="nohup $JAVACMD ${JVM_OPTS} -jar ${WAR_FILE} ${SPRING_OPTS} &>${LOG_PATH}/console.log &"
echo "\"${cmd}\""
eval ${cmd}
PID=$!
print_log "Server is started with pid \"${PID}\""
}

如您所见,对于后台进程启动,我使用 nohup .一切正常,发送 STDOUTSTDERR到我的${LOG_PATH}/console.log . console.log报告我的服务器已启动并在预配置的端口上运行(使用 Spring 配置文件)。我有个人资料dev-https配置端口 8443 :

spring:
profiles.active: dev-https
...
---

spring:
profiles: dev-https
server:
port: 8443
ssl:
enabled: true
protocol: TLS
enabled-protocols: TLSv1.2
key-store: <path>
key-store-password: <password>

但是,当我尝试将服务器作为前台进程启动时,出现了意外行为。每当我使用 start_foreground() 部署服务器时,它开始正常,但端口重置为默认值 8080 .

如果我附加调试器,并尝试使用 environment.getProperty("server.port") 获取值,它将返回空字符串(但是,如果未定义属性,它通常返回 null )。此外,所有其他属性都返回预期值:

environment.getProperty("spring.profiles.active")=dev-https

environment.getProperty("server.ssl.enabled")=true

等等

我试图替换 evalexec甚至运行 ${cmd}单独在里面start_foreground() bash 函数,但端口总是重置为 8080 , 和 server.port返回空字符串。

最奇怪的是,如果我执行 ${cmd}在我的控制台中(不是在脚本中),一切都完美无缺(使用正确的配置文件和正确的端口)。

有人遇到过这么奇怪的问题吗?

最佳答案

看起来您正在使用配置(如端口号等...仅用于后台而不用于前台。您尚未声明变量(您错过了这一行)

`SPRING_OPTS="--spring.pid.file=${PID_FILE} ${SPRING_OPTS}"` 

前景。

关于java - 从 bash 脚本中将 Spring Boot 作为前台进程启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48325026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com