我正在尝试从linux中的systemd服务启动jar。我正在执行的jar假定在当前目录中有一个xml文件。我使用-config参数传递该文件的名称。我创建的示例服务如下:
[Unit]
Description=my service
After=network.target
[Service]
Type=simple
Environment="xml_file_name=sample.xml"
ExecStart=/usr/bin/java -jar /path/to/jar/myapp.jar -config ${xml_file_name}
上面的服务文件放在/ usr / lib / systemd / system目录中,名为myservice.service。我正在执行以下命令来启动它:
systemctl daemon-reload
systemctl stop myservice.service
systemctl start myservice.service
systemctl status myservice.service
systemctl status myservice.service
命令显示jar文件已运行,但我的应用程序说它无法找到$ {xml_file_name}。
另外,我的jar声明它是从/目录执行的。我认为这是问题的一部分,因为$ {xml_file_name}仅适用于/ path / to / jar /目录。
事情尝试了: -Xbootclasspath/p:"/path/to/jar/"
:在前面添加jar的路径
位置,以便可以看到$ {xml_file_name}。
将/ path /更改为/ jar /以确保其已启用所有可能的权限
我尝试在我的systemd服务的User=root
部分下添加[Service]
,但它没有做任何更改。无论哪种方式,只有root用户在计算机上,并且所有权限似乎都已签出。
更令人奇怪的是,如果我cd到/,然后手动执行:
/usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml
一切都很好。
我有什么明显的遗漏吗?是否可以告诉systemd服务,执行这个java jar,但确保工作路径是/path/to/jar/
而不是/
?
答案 0 :(得分:23)
要解决此问题,我最终在[Service]
部分使用了以下属性:
[Service]
...
WorkingDirectory=/path/to/jar
ExecStart=/usr/bin/java -jar my.jar -config sample.xml
解决了问题!
答案 1 :(得分:-2)
请尝试以下操作:
cd /path/to/jar && /usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml
如果您使用&&在类似Linux的系统中,它只会在第一个命令执行成功后才能执行第二个命令。所以基本上它首先会改变工作目录,然后从更改的目录运行java jar命令,这可以解决问题。