2017-09-26 68 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