Java systemd 服务而不指定 java -jar

Java systemd 服务而不指定 java -jar

我目前正在努力使 SpringBootApp 作为服务运行。最大的问题是 Devops 不允许我们对部署工件和创建服务的 Ansible 脚本进行更改(示例如下所示)。

[Unit]
Description=A Spring Boot application
After=syslog.target

[Service]
User=rating-gateway
ExecStart=/opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143
Restart=always
RestartSec=5

从技术上讲,如果我在 ExecStart 上添加 java -jar 它将正确运行,但由于我们无法编辑 Ansible 脚本,我需要找到解决方法。我读过一些指南,其中服务不使用 java -jar 指令,但不确定要正确运行会缺少什么。

我已将 java 添加到 PATH 中,因为我认为这会对我有所帮助。但事实并非如此。

PATH=/home/rating-gateway/.local/bin:/home/rating-gateway/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-1.el8_3.x86_64/bin

还有其他想法吗?解决这个问题?

先谢谢了。

附言。我是一名开发人员,但拥有服务器的 root 访问权限,因此非常欢迎任何帮助。


(编辑额外信息)当我在 ExecStart 命令上没有 java -jar 时。我在 /var/log/messages 中收到以下错误

Mar 30 08:44:44 systemd[134389]: rating-gateway.service: Failed at step EXEC spawning /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar: Exec format error

但我已经确认了构建 jar 的平台和部署的服务器的架构。两者都是x84_64

答案1

您可以使用 Linux 内核对各种二进制格式的支持 (binfmt_misc)。这允许您注册一个解释器(例如 Java)以根据文件(例如 jar 文件)的前几个字节来执行文件。请参阅 https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst了解更多信息。

答案2

您的错误是由于系统尝试解析 jar 文件搜索解释器指令 - #!/interpreter

一种方法是只创建名为的 shell 脚本rating-gateway-0.0.1-SNAPSHOT.jar并从中运行您的 Java 应用程序。

所以你最终会得到 2 个文件:

  • /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.realjar.jar- 你实际的 jar 文件
  • /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar- 简单的 shell 脚本,包含以下内容:
#!/usr/bin/env sh

java -jar /opt/rating-gateway/rating-gateway-0.0.1-SNAPSHOT.jar

相关内容