该软件包maven
取决于default-jre-headless (>= 2:1.7) | java7-runtime-headless
(根据sudo dpkg -I /var/cache/apt/archives/maven_3.5.2-2_all.deb
)。我注意到在 Docker 内运行的 Ubuntu 18.04 上出现以下行为(图片docker:18.04
):
apt-get update && apt-get install --yes openjdk-8-jdk
apt-get install --yes maven
安装 OpenJDK 8 JDK(包括 JRE),然后只安装 Maven,因为已经提供了 JRE。然而两者
apt-get update && apt-get install --yes maven openjdk-8-jdk
和
apt-get update && apt-get install --yes openjdk-8-jdk maven
导致安装 OpenJDK 11 JRE,因为它是默认的 JRE。为什么不apt-get install
扫描包列表来检查是否提供了依赖项?到目前为止,我会说apt-get
通常会这样做,即使我没有找到有关它的信息。
在https://gitlab.com/krichter/maven-enforcer-plugin-docker/pipelines/26241321中提供了命令和结果的概述(项目需要 JDK 8 到maven-enforcer-plugin
)。我没有理由相信我的桌面 Ubuntu 18.04 上的行为是不同的。
我正在寻找对所描述场景的解释,也许是对适应包列表解析的配置的提示。这对我来说不是问题,我不需要解决方法。
在我看来,这种行为是次优的,因为它更直观的是,一个包的显式规范满足同一列表中包的依赖关系覆盖了安装隐式默认值的需要。如果您希望同时安装 OpenJDK 8 和 11,您可以在包列表中指定两者。也许其他人有这个想法并提交了增强请求(可能是 Debian 而不是 Ubuntu)。我很高兴这个链接。
这可能是 apt 如何遍历依赖关系树的结果。查看
maven
包装细节,我们看到:如果
openjdk-8-jre-headless
已安装,则java-7-runtime-headless
依赖项已完成,并且 apt 不需要在此处安装任何其他内容。另一方面,如果没有
java-7-runtime-headless
安装任何令人满意的东西,那么 apt 将首先安装 fordefault-jre-headless
,因为命名为安装的包都没有满足任一依赖项,并且 JDK 11 被安装。由于否则满足此依赖关系的包被埋在另一个包的依赖关系中,因此在创建要安装的包列表时,我们有一个 Catch-22。如果您明确命名提供
java7-runtime-headless
安装的软件包之一,apt 将按您的意愿工作:muru提供的解决方案不是完整的IMO。当你跑
你只有 JRE,没有 JDK。要在不安装 OpenJDK 11 的情况下使用 Maven 安装 OpenJDK 8 版本,我修改了 apt 命令