java - systemd 找不到 Java

标签 java spring-boot centos systemctl

我在尝试运行使用 spring boot 创建的可引导 jar 的 Centos Dist 上遇到了一个奇怪的行为。
如果我从 shell 运行 jar 应用程序,它会完美运行
enter image description here
使用以下配置创建的服务运行应用程序时:

[Unit]
Description=app
After=syslog.target

[Service]
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
~
我不断收到错误“无法找到 Java”
enter image description here
我检查了 $PATH 和 $JAVA_HOME 属性并且它们设置正确(我不认为这会增加更多信息,因为可引导 jar 在没有服务的情况下正确运行)
我做错了什么?解决这个问题 3 天了,这让我很生气。

最佳答案

问题的长短在于 systemd 不会在与用户 shell 相同的上下文中运行服务,用于运行 .jar 文件的机制直接使用 PATH变量来确定运行 jar 的 JRE 的位置。
如果 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/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
然后我们重新加载systemd(systemctl daemon-reload),我们应该能够启动服务(systemctl start blah.service)。
如果您要使用的 jre 集成到操作系统中,可能会容易得多;它省去了在 PATH 上的麻烦,并且可以在升级到 java 后幸存下来,这会改变路径,需要更新服务定义 - 有一个漂亮的 good guide here至于如何安装,系统集成:
  • 下载转
  • 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

  • 关于java - systemd 找不到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63377036/

    相关文章:

    java - HttpClient 在处理最大数量的请求时会阻塞?

    java - 如何在GWT中获取HTMLIFrameElement的Document对象

    java - 如何在命令提示符下运行 Java 程序

    java.lang.IllegalArgumentException,我在游戏商店的崩溃报告中得到了这个异常,建议我如何解决这个问题......

    spring - Maven react 器: pom using Spring boot starter pom

    spring-boot - 从 Spring Actuator 获取 Spring Session 信息

    spring - 如何使用 Thymeleaf 模板从 Json 加载数据

    jboss - 访问 JBOSS-AS 服务器进行远程连接

    centos - 阻止依赖包在 yum history undo 命令中被删除

    mongodb - 为远程 MongoVUE GUI 访问设置 CentOS 防火墙