Запуск Spring Boot как процесса переднего плана из сценария bash
я упаковываю свою весеннюю загрузочную войну со встроенным контейнером сервлетов Tomcat. И разверните его как обычное приложение java, используя java -jar server.war <Spring Args>
. Я написал сценарий 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
. Все работает нормально, он отправляет STDOUT
и STDERR
мой ${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
etc.
я попытался заменить eval
С exec
и даже запустить ${cmd}
сам по себе внутри start_foreground()
функция bash, но порт всегда сбрасывается на 8080
и server.port
возвращает пустую строку.
самое странное, что если я выполнить ${cmd}
в моей консоли (не из скрипта) все работает безупречно (правый профиль и правый порт get используемый.)
кто-нибудь сталкивался с такой странной проблемой?
2 ответов
похоже, вы используете конфигурацию(например, номер порта и т. д... только для фона и не используется для переднего плана. Вы не объявили переменную (вы пропустили эту строку)
`SPRING_OPTS="--spring.pid.file=${PID_FILE} ${SPRING_OPTS}"`
на переднем плане.
Я попытался воспроизвести эту проблему с новым экземпляром Spring Boot. Написал небольшой bash-скрипт, и все прошло отлично!
затем я начал играть с моим оригинальным сценарием и узнал, что я использую SERVER_PORT
переменной (потому что у меня был необязательный аргумент --port <num>
для пользователей).
по-видимому, эта переменная среды также используется Spring Framework: https://www.concretepage.com/spring-boot/spring-boot-change-default-server-port#server_port
моей ошибкой был экспорт SERVER_PORT
var (однако мне это было нужно по другим причинам).
решение было бы либо удалить export
С export SERVER_PORT=""
или переименовать переменную в что-то другое (что я в конечном итоге сделал).