我目前正在努力使 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