Java Systemd强制执行目录

Java Systemd强制执行目录,java,spring-boot,service,systemd,Java,Spring Boot,Service,Systemd,我有一个Java应用程序,我想创建一个系统服务来在启动时执行jar。我知道如何为新贵和SysV做这件事,但我在systemd方面遇到了麻烦 困难的部分是,我需要从jar所在的目录中执行jar,这样它就可以选择它旁边的application.properties,以及一些与jar位置相关的目录 例如,假设以下结构: +-var +-myapp +-app.jar +-app.log +-application.properties +-

我有一个Java应用程序,我想创建一个系统服务来在启动时执行jar。我知道如何为新贵SysV做这件事,但我在systemd方面遇到了麻烦

困难的部分是,我需要从jar所在的目录中执行jar,这样它就可以选择它旁边的
application.properties
,以及一些与jar位置相关的目录

例如,假设以下结构:

+-var
   +-myapp
       +-app.jar
       +-app.log
       +-application.properties
       +-certificate.jks
       +-images
           +-img1.jpg
我想要执行jar的方式是:

$ cd /var/myapp
$ java -jar app.jar
因此,当执行jar时,我在myapp目录中,它会登录到
app.log
,它会拾取
application.properties
并读取
certificate.jks
。它还可以找到目录
图像

我尝试将此作为systemd的单位文件

 [Unit]
 Description=App Description
 After=network.target

 [Service]
 Type=simple
 User=sebasira
 WorkingDirectory=/var/myapp
 ExecStart=/usr/bin/java -jar app.jar
 SuccessExitStatus=143
 Restart=on-failure

 [Install]
 WantedBy=multi-user.target   
它运行jar文件,但不是从
/var/myapp


如何解决它?

制作一个类似于/var/myapp的shell脚本:

#!/bin/sh
# runMyJar.sh    
java  -Djava.awt.headless=true -jar /var/myapp/app.jar
当然,要使其可执行

然后将其配置为启动时分叉的服务:

    [Unit]
    Description=My App Jar

    [Service]
    Type=forking
    ExecStart=/var/myapp/runMyJar.sh

    [Install]
    WantedBy=multi-user.target
根据需要添加其他systemd选项

jar文件应以/var/myapp作为默认主目录或工作区目录执行


编辑(基于@sebasira评论)

以下
.sh
脚本也可用于此systemd配置:

#!/bin/sh
# runMyJar.sh    
cd /var/myapp/;java -jar app.jar

不知怎的,这是一个问题:但这对meDid不起作用。你试试下面我的简单(也许是幼稚)解决方案?它曾经为我工作。嗨!谢谢对不起,我还没有试过,给我两个小时谢谢!我在你的指导下成功了。我只是将脚本从runMyJar.sh更改为
cd/var/myapp/;java-jar app.jar