我正试图在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服务的
[Service]
部分下添加User=root
,但没有更改。无论哪种方式,只有根用户在机器上,并且权限似乎都已签出。
更奇怪的是,如果我cd到/,然后手动执行:
/usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml
一切都很好。
有什么明显的东西我在这里失踪了吗?是否可以告诉systemd服务,执行这个java jar,但确保工作路径是/path/to/jar/
而不是/
?
为了解决这个问题,我最终在[Service]
部分下使用了以下属性:
[Service]
...
WorkingDirectory=/path/to/jar
ExecStart=/usr/bin/java -jar my.jar -config sample.xml
解决了问题!
尝试以下操作:
cd /path/to/jar && /usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml
如果您使用&;在类似Linux的系统中,它将两个命令组合在一起,第二个命令只有在第一个命令成功执行后才能执行。因此,基本上它会首先更改工作目录,然后从更改后的目录运行javajar命令,这本可以解决问题。