Ich verpacke meinen Spring Boot War mit eingebettetem Tomcat Servlet Container. Und stellen Sie es als reguläre Java-Anwendung mit java -jar server.war <Spring Args>
bereit. Ich schrieb ein Bash-Skript, das die Bereitstellung des Servers als Hintergrund / Vordergrund-Prozess übernehmen würde:
Wie Sie sehen, verwende ich für den Start des Hintergrundprozesses nohup
. Alles funktioniert gut, es sendet STDOUT
und STDERR
an meine ${LOG_PATH}/console.log
. console.log
meldet, dass mein Server auf dem vorkonfigurierten Port läuft (unter Verwendung von Spring-Profilen). Ich habe ein Profil dev-https
, das mit dem Port 8443
:
Wenn ich jedoch versuche, den Server als Vordergrundprozess zu starten, erhalte ich unerwartetes Verhalten. Immer wenn ich den Server mit start_foreground()
veröffentliche, startet er gut, aber der Port wird auf den Standard 8080
zurückgesetzt.
Wenn ich einen Debugger anschließe und versuche, Werte mit environment.getProperty("server.port")
zu erhalten, wird eine leere Zeichenfolge zurückgegeben (wenn jedoch eine Eigenschaft nicht definiert ist, gibt sie normalerweise null
zurück). Darüber hinaus geben alle anderen Eigenschaften erwartete Werte zurück:
environment.getProperty("spring.profiles.active")=dev-https
environment.getProperty("server.ssl.enabled")=true
usw.
Ich habe versucht, eval
durch exec
zu ersetzen und sogar ${cmd}
in start_foreground()
bash-Funktion zu verwenden, aber der Port wird immer auf 8080
zurückgesetzt, und server.port
gibt eine leere Zeichenfolge zurück.
Der seltsamste Teil ist, dass wenn ich ${cmd}
in meiner Konsole (nicht innerhalb des Skripts) ausführe, alles einwandfrei funktioniert (rechtes Profil und der richtige Port wird benutzt).
Hat jemand auf so ein seltsames Problem gestoßen?
Ich habe versucht, dieses Problem mit einer neuen Instanz von Spring Boot zu reproduzieren. Schrieb ein schnelles Bash-Skript, und alles ging gut!
Dann fing ich an, mit meinem ursprünglichen Skript herumzuspielen und fand heraus, dass ich SERVER_PORT
variable benutzte (weil ich ein optionales Argument --port <num>
für den Benutzer hatte).
Offensichtlich wird diese Umgebungsvariable auch von Spring Framework verwendet: Ссылка
Mein Fehler war SERVER_PORT
var zu exportieren (ich brauchte es jedoch aus anderen Gründen).
Lösung wäre, export
von export SERVER_PORT=""
zu entfernen oder die Variable in etwas anderes umzubenennen (was ich am Ende getan habe).
Es sieht so aus, als ob Sie die Konfiguration verwenden (wie Port-Nummer usw. nur für Hintergrund und nicht für Vordergrund). Sie haben die Variable nicht deklariert (Sie haben diese Zeile verpasst)
%Vor%für Vordergrund.