如何將 RPM 包設置為需要 Java 8 或更高版本,Java 11 可以滿足其依賴關係
我正在嘗試打包一個需要 Java 8 以上任何 Java 版本的 RPM。如果沒有安裝 Java,或者安裝了 JRE/JDK for 8,則 RPM 可以正常工作。但是,如果我安裝 OpenJDK 11,當我安裝我的 RPM 時,它會嘗試再次安裝 Java 8。
如何讓我的 RPM 檢測到已經存在應該與我的包兼容的 Java 11 安裝?如果我已經有 Java 11,我不希望我的包安裝 Java 8!
我正在執行 Red Hat 7.5,但這也在 CentOS7 中重現。我能夠用一個簡單的 hello world 包來重現它:
Name: hello-world Version: 1 Release: 1 Summary: Most simple RPM package License: FIXME Requires: jre-headless >= 1.8 %description %prep %build cat > hello-world.sh <<EOF #!/usr/bin/bash echo Hello world EOF %install mkdir -p %{buildroot}/usr/bin/ install -m 755 hello-world.sh %{buildroot}/usr/bin/hello-world.sh %files /usr/bin/hello-world.sh %changelog
建構:
rpmdev-setuptree rpmbuild -ba hello-world.spec
然後安裝 OpenJDK11:
sudo yum -y install java-11-openjdk
最後測試我的包:
rpm -i --test <FILE>.rpm
給出:error: Failed dependencies: jre-headless >= 1.8 is needed by hello-world-1-1.x86_64
sudo yum localinstall <FILE>.rpm
還嘗試安裝 Java8。
sudo yum deplist <FILE>.rpm
建議java-11-openjdk
應該提供我需要的東西:Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.heanet.ie * extras: ftp.heanet.ie * updates: ftp.heanet.ie package: hello-world.x86_64 1-1 dependency: /usr/bin/bash provider: bash.x86_64 4.2.46-31.el7 dependency: jre-headless >= 1.8 provider: java-11-openjdk-headless.x86_64 1:11.0.ea.28-7.el7 provider: java-11-openjdk-headless.i686 1:11.0.ea.28-7.el7 provider: java-1.8.0-openjdk-headless.x86_64 1:1.8.0.201.b09-2.el7_6 provider: java-1.8.0-openjdk-headless.i686 1:1.8.0.191.b12-1.el7_6 provider: java-1.7.0-openjdk-headless.x86_64 1:1.7.0.211-2.6.17.1.el7_6
(也不確定為什麼 Java 7 是 Java 8 的提供者)。
我嘗試設置要求
jre
或java
但沒有運氣。我還專門嘗試了預安裝java-11-openjdk-headless
,但沒有任何區別。布爾依賴項似乎可以解決這個問題,但遺憾的是我不能保證我的最終使用者安裝了足夠新的版本
rpm
。我不確定我做錯了什麼?
如何將 RPM 包設置為需要 Java 8 或更高版本,Java 11 滿足其依賴關係?
目前,RHEL 7 和 8 中的 OpenJDK 11 包不提供
java-headless
,jre-headless
或任何未版本控制的 Java 包。(據我了解,原因是 OpenJDK 11 不能保證在所有情況下都可以替代 OpenJDK 8。)當 OpenJDK 11 成為系統 JDK 時,這將改變;您可以嘗試跟踪此錯誤以收到更改通知。不幸的是,我認為目前沒有一種方法可以讓 RPM 包僅依賴於
jre-headless
OpenJDK 11 並可以安裝在 OpenJDK 11 上,而無需使用布爾依賴項(以及有效的 RHEL 8)。一個典型的解決方法是使用文件要求而不是包要求,但java-8-openjdk-headless
不java-11-openjdk-headless
提供您可以依賴的通用文件(我不認為文件要求可以版本化)。您的查詢表明
jre-headless
OpenJDK 11 軟體包可以滿足您的要求,但這是因為早期訪問軟體包錯誤地提供了預設軟體包;所以yum whatprovides jre-headless
列出了 OpenJDK 8 和 OpenJDK 11 包,但後者不再可安裝。