我正在尝试打包一个需要 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 满足?
答案1
目前,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 软件包,但后者不再可安装。