我正在使用spring IO框架创建的应用程序,该框架使用json格式显示主机名。
通过以下命令从命令行启动应用程序时,该应用程序正常工作:
java -jar spring-cd.jar
给出了所需的输出:
但是当它作为服务使用systemd单元文件运行时,reuqired输出(主机名)为null:
单位文件的代码如下:
[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;
}
}
答案 0 :(得分:1)
在systemd运行时,Java程序环境中没有使用in your code的环境变量HOSTNAME
。
简单的解决方法是直接在服务单元文件中的[Service]
部分下添加缺少的环境变量:
[Service]
...
Environment=HOSTNAME=%H
加载单位配置时正在运行的系统的%H
说明符stands for the hostname。
或者(不是使用Environment
指令定义每个变量),您可以将所有变量放在文件中并使用EnvironmentFile
指令,或者使用PassEnvironment
传递一系列变量指令。
然而,更便携的方式将使用标准Java类java.net.InetAddress
和getHostName()
方法:
hostname = InetAddress.getLocalHost().getHostName();
(如this answer中所述)