运行 Java 通过 systemd 时无法识别的选项

Unrecognized option when running Java via systemd

我正在尝试 运行 Java 应用程序作为 systemd 的系统服务。该服务的 .service 文件具有以下命令行:

ExecStart=/usr/bin/java -cp $CLASSPATH:/path/to/my.jar org.example.MainClass -myoption

其中 -myoption 是一个选项,旨在传递给主要 class 的 main() 方法。

当我从 bash 启动它时,命令行按预期工作;该选项传递给主要 class.

但是,当我尝试使用 systemctl start 启动服务然后使用 systemctl status 查询其状态时,我发现 JVM 终止于:

Unrecognized option: -myoption

显然,JVM 试图理解 -myoption 而不是将其作为参数传递给主 class。

由于该服务设计为在向 JVM 发送 SIGINT 时退出,我无法使用会从 systemd 中隐藏 JVM 的 PID 的变通方法。

作为 systemd 服务启动时,如何将命令行选项传递给主 class?

ExecStart 中的环境变量必须用大括号括起来,除非它们是单独的词(并且不能在可执行文件本身的路径中使用)。

以下按预期工作:

ExecStart=/usr/bin/java -cp ${CLASSPATH}:/path/to/my.jar org.example.MainClass -myoption