首页 > 解决方案 > RedHat - RPM 如何自动选择正确的 JVM 版本?

问题描述

我分发我自己的 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 是被选中的,而我的应用程序无法正常运行。如果我使用“替代方案”并选择 Java 11 - 一切正常。但我想为我的客户提供一个“自包含”的 RPM 包,而无需执行额外的手动步骤。我不希望他们选择正确的 Java 版本,我希望这会以某种方式自行发生。

执行我的 jar 时,是否可以以某种方式自动选择正确的 Java 版本?

标签: javaredhatrpm

解决方案


执行我的 jar 时,是否可以以某种方式自动选择正确的 Java 版本?

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

 $ java -jar some.jar

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

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

这有两种变化:

  • 您可以让安装程序脚本做出选择并将其嵌入到生成的包装脚本中。
  • 您可以让包装脚本自己做出选择,可能在命令行选项或环境变量的指导下进行。

(请注意,该/etc/alternatives机制并不能直接帮助解决这个问题。它允许用户选择(例如)java命令的版本。但是通过修改符号链接链来工作/usr/bin/java。它影响使用的一切/usr/bin/java......不仅仅是你的应用。)

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


推荐阅读