问题描述
我在Centos Dist上遇到奇怪的行为,试图运行使用Spring Boot创建的可启动jar。
如果我从外壳程序运行jar应用程序,它将完美运行
使用通过以下配置创建的服务运行应用程序时:
[Unit]
Description=app
After=syslog.target
[Service]
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
~
我一直收到错误消息“无法找到Java”
我检查了$ PATH和$ JAVA_HOME属性,并正确设置了它们(我不认为这会添加更多信息,因为可启动jar无需运行任何服务即可正确运行)
我做错了什么?解决这个问题已经三天了,这让我发疯了。
解决方法
这个问题的长处和短处是systemd不会在与用户外壳程序相同的上下文中运行服务,并且用于运行.jar文件的机制直接使用PATH
变量来确定目录的位置。 JRE用于运行jar。
如果java在默认的systemd路径上,则该服务将默认启动。 default path for systemd绝对不包含您为Java指定的路径。
要解决PATH变量设置不充分的问题,我们将使用更适合它的PATH
环境变量来更新服务配置。为此,我们需要在服务定义文件的Environment
部分中添加一个[Service]
变量。
[Unit]
Description=app
After=syslog.target
[Service]
Environment=PATH=/usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm/jdk-14.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
然后,我们重新加载systemd(systemctl daemon-reload
),我们应该能够启动服务(systemctl start blah.service
)。
如果要使用的jre集成到OS中,可能会容易得多。它省去了使用PATH的麻烦,并且可以在升级到Java后幸免,这会改变路径,需要更新服务定义-系统安装非常漂亮,good guide here是关于如何安装它的: / p>
- 下载rpm
-
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/14.0.2+12/205943a0976c4ed48cb16f1043c5c647/jdk-14.0.2_linux-x64_bin.rpm
-
- 本地安装
-
yum localinstall jdk-14.0.2_linux-x64_bin.rpm
-
- 使用
alternatives
来配置Java-
alternatives --config java
-
- 设置后检查
-
java -version
-