Java应用程序作为服务启动时无法正常工作

时间:2017-09-26 11:56:06

标签: java linux spring web-services systemd

我正在使用spring IO框架创建的应用程序,该框架使用json格式显示主机名。

通过以下命令从命令行启动应用程序时,该应用程序正常工作:

java -jar spring-cd.jar

给出了所需的输出:

enter image description here

但是当它作为服务使用systemd单元文件运行时,reuqired输出(主机名)为null:

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

我不明白这些方法之间有什么区别,为什么第二个显示“null”。我也是相当新的系统和Linux。

相关的Java代码:

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;
    }
}

1 个答案:

答案 0 :(得分:1)

在systemd运行时,Java程序环境中没有使用in your code的环境变量HOSTNAME

简单的解决方法是直接在服务单元文件中的[Service]部分下添加缺少的环境变量:

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

加载单位配置时正在运行的系统的%H说明符stands for the hostname

或者(不是使用Environment指令定义每个变量),您可以将所有变量放在文件中并使用EnvironmentFile指令,或者使用PassEnvironment传递一系列变量指令。

然而,更便携的方式将使用标准Java类java.net.InetAddressgetHostName()方法:

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

(如this answer中所述)