标题说明了一切。我想在同一台机器上安装 2 个版本的 Java。例如14.0.1.7
和14.0.2.12
(它们都在 EPEL7 repo 中)。
如果我通过 逐个安装它们yum
,yum 将删除第一个版本并仅保留最后一个。如果我通过 安装它们,rpm
依赖项将被解析但不会自动安装。如果我首先使用 安装yum
第二个,然后rpm
使用,那么它会工作并且会保留两个版本,但rpm
如果在某个时候弹出,它将不会安装任何其他依赖项,如果能够仅通过一个工具来完成它,那就太酷了。
所有提到的 java 都是 OpenJDK;EPEL7 有这些滚动包(例如:java-14-openjdk-14.0.1.7-2.rolling.el7.x86_64
、java-14-openjdk-14.0.2.12-1.rolling.el7.x86_64
)。
有任何想法吗?
答案1
你不需要。请升级到更高版本的软件包,它已修复了问题。
java-latest-openjdk
14.0.2.12-1
取代14.0.1.7-2
。EPEL 镜像不会携带旧版本,这是他们的通常政策。
这上游发行说明假设安全修补版本 14 是14.0.2+12
。请注意常见的时区数据和 x509 证书更改,以及错误修复。考虑一下您是否真的需要固定此版本。文档表明这是您打算采用的次要维护版本。
如果您确定需要保留以前的版本,则需要解决两个问题:获取软件包并安装它。旧版本不再在镜像中,请考虑设置您自己的私有镜像或缓存代理来存档旧版本。而且,这两个版本不能并行安装。研究一种拥有两个并行环境的方法,无论是容器、虚拟机还是专门允许您选择 Java 运行时的运行时管理器实用程序。
答案2
简短回答:使用 Java 运行时管理器,例如SDK人!或者环境变量
长答案:默认情况下,包管理器会尝试帮助您保持系统中包的最新版本。这就是为什么通常会为不同的语言找到类似上述的替代包管理器(python 的 pyenv 或 conda,node/js 的 nvm 等)。
您提到这是针对 EPEL 的,这可能意味着您在互联网访问上受到限制。这可能是一个问题。一般来说,这些 alt 包管理器安装在用户会话中,并且控制的环境变量仅影响当前用户。这可能是一个优点或缺点,具体取决于您正在处理的具体工作。
如果没有更多信息,我认为使用上面提到的现有工具(顺便说一下,可能会有更新的工具)可能是一个不错的起点。如有需要,请随意添加更多信息,祝你好运!
答案3
这是 Docker 的主要用例之一,其中容器可以在其自己隔离的环境中包含不同的支持库和/或不同的应用程序版本,而无需虚拟化的开销和复杂性。
在最简单的 Dockerfile 中,可以获取 CentOS 或 RHEL 基础映像、添加存储库并安装所需的软件包。
这里的用例是什么以及目标是否可以通过容器来表达很重要。在大多数情况下,可以。这是一个示例 dockerfile:
FROM centos
RUN yum update -y
RUN yum install -y epel-release
RUN yum install -y java-14-openjdk-14.0.1.7-2.rolling.el7.x86_64
ENV JAVA_HOME /etc/alternatives/jre
WORKDIR /app
EXPOSE 8080
CMD [run.sh]
最后一段几乎完全是虚构的,但确实有效。如果你可以将应用程序表达为微服务,那么这种基于 docker 的解决方案就非常有意义了。
否则,您可以使用 LXD 容器实现类似的结果,但您可以公开整个 IP(非常像 VM)。您也可以使用 VM。两者都比基于 docker 的解决方案更复杂,后者为每个应用程序公开一个 IP/端口组合。