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

Java应用作为服务启动时无法正常工作,java,linux,spring,web-services,systemd,Java,Linux,Spring,Web Services,Systemd,我正在开发一个使用SpringIO框架创建的应用程序,该框架使用json格式显示主机名 通过以下命令从命令行启动应用程序时,应用程序工作正常: java -jar spring-cd.jar 提供所需的输出: 但当它作为服务使用systemd单元文件运行时,reuqired输出(主机名)为空: 单位文件的代码如下所示: [Unit] After=network.target [Service] ExecStart=/usr/bin/java -jar /opt/training/spri

我正在开发一个使用SpringIO框架创建的应用程序,该框架使用json格式显示主机名

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

java -jar spring-cd.jar
提供所需的输出:

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

单位文件的代码如下所示:

[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”。另外,我对systemd和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;
    }
}

由systemd运行时,您使用的环境变量
HOSTNAME
在Java程序的环境中不可用

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

[Service]
...
Environment=HOSTNAME=%H
加载装置配置时运行系统的
%H
说明符

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


但是,一种更具可移植性的方法是使用标准Java类和方法:


(如中所述)

您能发布读取主机名的相关Java代码吗?我编辑了文章并添加了指向包含Java代码的github repo的链接。我想环境变量可能不同。@MiM1,请查看我更新的答案,以获得更方便的主机名。@MiM1,我已将您的代码的相关部分从GitHub repo复制到问题中。最好把它放在这里供将来的读者阅读。不客气!我建议您也尝试更具可移植性的方法,Java会注意在Windows和Linux上找到合适的主机名。它可以简化代码及其维护。
hostname = InetAddress.getLocalHost().getHostName();