问题描述
我分发了自己的RPM软件包,其中包含jar文件。我定位到RHEL 8。
默认情况下,在RHEL 8上安装了Java8。我的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版本?
解决方法
执行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版本。)