如何配置rpmbuild仅在未安装高版本OpenJDK时安装OpenJDK 8?兼容RHEL7/8
解决RPM包Java依赖冲突问题(兼容RHEL8/RHEL7)
需求说明
- 目标RPM包依赖至少OpenJDK 1.8.0
- 若系统已安装
java-11-openjdk/java-17-openjdk/java-21-openjdk系列包,禁止自动安装java-1.8.0-openjdk相关组件
当前环境(RHEL8)
执行rpm -qa | grep java输出:
# rpm -qa | grep java java-11-openjdk-devel-11.0.23.0.9-3.el8.x86_64 tzdata-java-2024a-1.el8.noarch javapackages-filesystem-5.3.0-1.module+el8+2447+6f56d9a6.noarch java-11-openjdk-11.0.23.0.9-3.el8.x86_64 java-11-openjdk-headless-11.0.23.0.9-3.el8.x86_64 ...
安装目标包时的错误行为:
Dependencies resolved. =================================== Package =================================== Installing: packageblabla Installing dependencies: java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless Installing weak dependencies: gtk2
问题排查
原SPEC文件的依赖配置逻辑错误:
%{?_with_rhel8:Requires: (( java-1.8.0-openjdk-devel or java-11-openjdk-devel ) and ( java-1.8.0-openjdk-devel or java-17-openjdk-devel ) and ( java-1.8.0-openjdk-devel or java-21-openjdk-devel )) }
该写法会被解析为必须同时满足三组or条件,导致yum仍会拉取java-1.8.0包。
尝试使用unless语法时,rpmbuild 4.14.3报错:
error: line 150: Illegal context for 'unless', please use 'or' instead: Requires: (( java-1.8.0-openjdk-devel unless java-11-openjdk-devel ) and ( java-1.8.0-openjdk-devel unless java-17-openjdk-devel ) and ( java-1.8.0-openjdk-devel unless java-21-openjdk-devel ))
原因是rpm 4.14.x对unless的支持有限,仅允许在特定上下文使用。
解决方案(兼容RHEL8和RHEL7)
RHEL8(rpm 4.14.3)配置
使用正确的布尔逻辑,明确需求为:需要java-1.8.0-openjdk-devel,或者java-11/17/21-openjdk-devel中的任意一个。在SPEC中写入:
%{?_with_rhel8:Requires: java-1.8.0-openjdk-devel or java-11-openjdk-devel or java-17-openjdk-devel or java-21-openjdk-devel}
如果需要同时依赖JRE和devel包,可扩展为:
%{?_with_rhel8:Requires: (java-1.8.0-openjdk or java-11-openjdk or java-17-openjdk or java-21-openjdk) and (java-1.8.0-openjdk-devel or java-11-openjdk-devel or java-17-openjdk-devel or java-21-openjdk-devel)}
RHEL7(rpm 4.11)兼容配置
rpm 4.11不支持复杂布尔依赖,可利用Red Hat系OpenJDK包提供的java-devel虚拟包简化配置:
%{?_with_rhel7:Requires: java-devel >= 1.8.0}
该配置会自动匹配系统中已有的最高兼容Java版本,无需额外冲突约束即可避免重复安装低版本。
完整SPEC片段
# RHEL8专属依赖配置 %{?_with_rhel8:Requires: java-1.8.0-openjdk-devel or java-11-openjdk-devel or java-17-openjdk-devel or java-21-openjdk-devel} %{?_with_rhel8:Requires: java-1.8.0-openjdk or java-11-openjdk or java-17-openjdk or java-21-openjdk} # RHEL7专属依赖配置 %{?_with_rhel7:Requires: java-devel >= 1.8.0}
验证方法
- 在已安装
java-11-openjdk的RHEL8系统执行yum install packageblabla,确认不会拉取java-1.8.0相关包 - 在无任何OpenJDK的系统执行安装,确认会自动安装
java-1.8.0-openjdk系列组件 - 在RHEL7系统重复上述验证,确保依赖解析正常
内容的提问来源于stack exchange,提问作者Pagai
相关产品推荐
相关产品推荐

