RedHat - RPM 如何自动 select 正确的 JVM 版本?

RedHat - how RPM may automatically select correct JVM version?

我分发自己的 RPM 包,其中包含 jar 文件。我的目标是 RHEL 8。

默认情况下,在 RHEL 8 上安装 Java 8. 我的 jar 需要 Java 11.

为了在丢失的情况下“自动”安装它,在我的 RPM“规范”中,我添加了对 Java 11 的依赖,如下所示:

Requires:       java-11-openjdk-headless

...确实 Java 11 个软件包与我的一起下载和安装。

为了执行我的 jar,我 运行 执行以下命令:

java -jar <my.jar>

但是,似乎 Java 8 是被 selected 的那个,我的应用程序无法正确地 运行。如果我使用“替代品”和 selecting Java 11 - 一切正常。但我想为我的客户提供一个“独立的”RPM 包,而不需要执行额外的手动步骤。我不希望他们 select 正确的 Java 版本,我希望它以某种方式自行发生。

当我的 jar 被执行时,是否有可能以某种方式自动 select 更正 Java 版本?

Is it possible somehow to automatically select correct Java version when my jar being executed?

如果您的客户 运行 您的应用程序是这样的:

 $ java -jar some.jar

那么您的应用程序不可能 select Java 的正确版本。您正在隐式使用当前搜索路径上的 Java 版本;即 java 指向什么。那是掌握在用户手中的。

如果您希望您的应用程序选择正确的版本,您将需要编写一个包装脚本,该脚本知道不同Java版本所在目录的路径名由发行版安装。您应该能够通过从(例如)/usr/bin/java 到实际可执行文件的符号链接来解决这个问题。

这有两种变体:

  • 您可以让安装程序脚本做出选择并将其嵌入到生成的包装器脚本中。
  • 您可以让包装脚本自己做出选择,可能需要 command-line 选项或环境变量的指导。

(请注意,/etc/alternatives 机制并不能直接帮助解决这个问题。它允许用户 select 一个版本的(比方说)java 命令。但是通过修改 /usr/bin/java 的符号链接链来工作。它会影响所有使用 /usr/bin/java 的东西……而不仅仅是你的应用程序。)

(另外,请注意,尝试使用 RPM 依赖项执行此操作是行不通的。依赖项确保安装了所需的 Java 版本......而不是实际使用它。)