【问题标题】:RedHat - how RPM may automatically select correct JVM version?RedHat - RPM 如何自动选择正确的 JVM 版本?
【发布时间】:2020-08-18 13:00:39
【问题描述】:

我分发我自己的 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 版本?

【问题讨论】:

    标签: java redhat rpm


    【解决方案1】:

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

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

     $ java -jar some.jar
    

    那么您的应用程序将无法选择正确的 Java 版本。您正在隐式使用当前搜索路径上的 Java 版本;即java 指向的内容。那是在用户手中。

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

    这有两种变体:

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

    (请注意/etc/alternatives 机制并不能直接帮助解决这个问题。这允许用户选择(比如说)java 命令的版本。但是可以通过修改/usr/bin/java 的符号链接链来实现. 它会影响使用/usr/bin/java 的所有东西......不仅仅是你的应用程序。)

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

    【讨论】:

    • 我的解决方案是在安装脚本中确定所需java版本的文件夹,然后从那里显式执行“java”。
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 2013-02-16
    • 2018-05-26
    • 2019-08-03
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多