Yum

如何將 RPM 包設置為需要 Java 8 或更高版本,Java 11 可以滿足其依賴關係

  • March 6, 2019

我正在嘗試打包一個需要 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 的提供者)。

我嘗試設置要求jrejava但沒有運氣。我還專門嘗試了預安裝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-headlessOpenJDK 11 並可以安裝在 OpenJDK 11 上,而無需使用布爾依賴項(以及有效的 RHEL 8)。一個典型的解決方法是使用文件要求而不是包要求,但java-8-openjdk-headlessjava-11-openjdk-headless提供您可以依賴的通用文件(我不認為文件要求可以版本化)。

您的查詢表明jre-headlessOpenJDK 11 軟體包可以滿足您的要求,但這是因為早期訪問軟體包錯誤地提供了預設軟體包;所以

yum whatprovides jre-headless

列出了 OpenJDK 8 和 OpenJDK 11 包,但後者不再可安裝。

引用自:https://unix.stackexchange.com/questions/504706