2017-09-26 66 views
1

我正在使用使用json格式顯示主機名的spring IO框架創建的應用程序。作爲服務啓動時,Java應用程序無法正常工作

當通過命令行由命令啓動的應用程序工作正常:

java -jar spring-cd.jar 

其給出所需的輸出:

enter image description here

但是當它被運行作爲服務使用系統單元文件reuqired輸出(主機名)爲空:

enter image description here

爲單位文件的代碼如下:

[Unit] 
After=network.target 

[Service] 
ExecStart=/usr/bin/java -jar /opt/training/spring-cd/spring-cd.jar 
Type=simple 
User=root 
Restart=always 

[Install] 
WantedBy=default.target 

我不明白什麼是這些辦法,爲什麼第二次顯示「空」之間的區別。此外,我相當新,並systemd和Linux。

相關的Java代碼:當systemd運行

import java.lang.System; 

public class Greeting { 
    private final String content; 

    public Greeting() { 
     this.content = getHostname(); 
    } 

    private String getHostname(){ 
     String hostname; 
     if (System.getProperty("os.name").startsWith("Windows")) { 
      hostname = System.getenv("COMPUTERNAME"); 
     } else { 
      hostname = System.getenv("HOSTNAME"); 
     } 
     return hostname; 
    } 

    public String getContent() { 
     return content; 
    } 
} 
+0

您可以發佈相關的Java讀取主機名的代碼? – randomir

+0

我編輯了帖子,並添加了包含java代碼的github repo的鏈接 – MiM1

+0

我猜環境變量可能不同。 – hailinzeng

回答

1

環境變量HOSTNAME您使用in your code是不是在Java程序的環境中使用。

簡單的解決方法是缺失的環境變量直接添加在服務單位的文件,根據[Service]部分:在時間點正在運行的系統的

[Service] 
... 
Environment=HOSTNAME=%H 

%Hstands for the hostname的單元配置是裝。

或者(而不是定義與Environment指令爲每個變量),你可以把所有的變量在一個文件中,並使用EnvironmentFile指令,或通過選擇的變量與PassEnvironment指令。


然而,更便攜的方式是使用標準的Java類java.net.InetAddressgetHostName()方法:

hostname = InetAddress.getLocalHost().getHostName(); 

(如this answer解釋)

+1

謝謝,它添加了一個環境變量 – MiM1

+0

不客氣!我建議你也嘗試更便攜的方法,其中Java在Windows和Linux上都需要注意找出正確的主機名。它可以簡化代碼和維護。 – randomir