如何在 Ubuntu 16.04 或更高版本上安装 openjdk 7?

ona*_*rda 128 java openjdk

我想将我的主系统升级到 16.04,但我从事需要 OpenJDK 7 的项目。

显然它不能从一个平凡的apt-get install openjdk-7-jdk. 存储库中仅列出了版本 8 和 9。

任何人都可以指出我如何安装它的说明吗?

ona*_*rda 149

安全警告

下面提到的 PPA 中的包没有更新 Java 的安全补丁。请勿在生产中使用;请参阅替代答案。

在撰写本文时,OpenJDK 7 的最后一次上传是在 '2016-04-22' 完成的,版本为 7u95 并且仍然可以作为“最新版”使用,其中 Ubuntu 14.04 已更新为 7u181


更新:虽然这是投票最多的答案,但由于此 PPA 缺乏安全更新,它可能不是您想在 2018 年使用的答案。

我发现以下说明对我有用:

sudo add-apt-repository ppa:openjdk-r/ppa  
sudo apt-get update   
sudo apt-get install openjdk-7-jdk  
Run Code Online (Sandbox Code Playgroud)

这将“用于 OpenJDK 上传的 PPA(受限)”定义为附加包存储库,更新您的信息,并安装包及其依赖项(来自该存储库)。

  • -1 因为这个 PPA 已经完全过时并且忽略了许多重要的安全补丁。安装这个是完全不可接受的,imo。 (19认同)
  • 如果您首先错误地安装了 openjdk-8(就像我所做的那样),那么在遵循此答案之后,您需要执行“sudo update-java-alternatives”,以便您可以将 openjdk-7 设为默认值。 (13认同)
  • 仅供参考:这目前不适用于 16.10 (6认同)
  • 也不适用于 17.04。 (3认同)
  • 该解决方案将不再起作用。软件包 openjdk-7-jdk 不可用,但被另一个软件包引用。这可能意味着该软件包丢失、已过时或只能从其他来源获得 E:软件包“openjdk-7-jdk”没有安装候选者 (3认同)
  • -1 也正如 PPA 建议的那样受到限制并且没有保持最新。 (2认同)

MDM*_*wer 65

2019 年 7 月 22 日编辑:此答案目前不起作用。以下引用的 JDK 包在 Debian 实验版上不再可用。无论如何,它们都落后于包含最新安全更新的 Ubuntu Trusty 软件包。请参考其他答案,直到可以解决此问题(抱歉,没有预计到达时间)。


看起来 openjdk-r/ppa 的维护者不会更新超过 7u95-2.6.4-3 版本的 openjdk-7 包。不过,该软件包的描述“从 Debian GNU/Linux 主要存档中的 debian 实验复制”为我们提供了有关如何自己处理此问题的线索。

选项 1:手动安装

  1. 下载适用于您的架构的软件包:(
    对于大多数用户来说,这意味着如果 64 位为 amd64,如果安装了 32 位 Ubuntu,则为 i386)

  2. (尝试)使用dpkg以下命令安装软件包:

    Ubuntu 17.10 及更早版本:

    sudo dpkg -i openjdk-7-* libjpeg62-turbo* libfontconfig1* fontconfig-config*
    
    Run Code Online (Sandbox Code Playgroud)

    Ubuntu 18.04 及更高版本:

    sudo dpkg -i openjdk-7-* libjpeg62-turbo*
    
    Run Code Online (Sandbox Code Playgroud)
  3. 检查从 的输出dpkg。如果存在依赖性问题——这很可能——您将看到以下内容(您的架构替换为 amd64):

    处理时遇到错误:
    openjdk-7-jre:amd64
    openjdk-7-jre-headless:amd64
    openjdk-7-jdk:amd64

    如果没有依赖问题,很好,你已经完成了,跳到 #4。否则,如果您需要解决一些依赖问题,可以通过以下方式处理:

    sudo apt install -f
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,dpkg在让apt解析依赖项后无需重新运行。它将自动完成 openjdk 包的安装。

  4. 更新 java 替代品。您可以查看所有已安装的 java 版本update-java-alternatives --list。要激活 OpenJDK Java 1.7,请运行:

    sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
    
    Run Code Online (Sandbox Code Playgroud)

    您可能会注意到有关IcedTeaPlugin.so插件不可用的错误。对于使用 JDK 的开发人员来说,这并不是真正关心的问题。

  5. 验证 java 是否正常工作:

    java -version
    
    Run Code Online (Sandbox Code Playgroud)

    它应该输出类似于:

    java版本“1.7.0_161”
    OpenJDK 运行时环境 (IcedTea 2.6.12) (7u161-2.6.12-1)
    OpenJDK 64 位服务器 VM(构建 24.161-b01,混合模式)

选项 2:自动安装(包括更新apt

Pinning可用于从 Debian 存储库安装和更新 openjdk-7-jdk 及其依赖项。

  1. 创建一个固定文件,告诉apt我们只考虑我们感兴趣的包(我们当然不希望我们的整个 Ubuntu 发行版“升级”为 Debian 实验包)。

    /etc/apt/preferences.d/debian使用以下内容创建文件。你需要超级用户权限,所以使用的一个sudo vimsudo nanogksudo gedit,等。

    Package: *
    Pin: release o=Debian,n=experimental
    Pin-Priority: -1
    
    Package: *
    Pin: release o=Debian,n=sid
    Pin-Priority: -1
    
    Package: openjdk-7-jdk
    Pin: release o=Debian,n=experimental
    Pin-Priority: 500
    
    Package: openjdk-7-jre
    Pin: release o=Debian,n=experimental
    Pin-Priority: 500
    
    Package: openjdk-7-jre-headless
    Pin: release o=Debian,n=experimental
    Pin-Priority: 500
    
    Package: libjpeg62-turbo
    Pin: release o=Debian,n=sid
    Pin-Priority: 500
    
    Run Code Online (Sandbox Code Playgroud)

    对于 Ubuntu 17.10 及更早版本,还附加以下内容(并参见底部的注释):

    Package: libfontconfig1
    Pin: release o=Debian,n=sid
    Pin-Priority: 500
    
    Package: fontconfig-config
    Pin: release o=Debian,n=sid
    Pin-Priority: 500
    
    Run Code Online (Sandbox Code Playgroud)
  2. 安装 Debian 密钥环:

    sudo apt install debian-archive-keyring
    
    Run Code Online (Sandbox Code Playgroud)

    注意:虽然这是添加 debian 密钥环的最简单方法,但它可能不是最新的。apt update在第 4 步中运行时,检查类似以下的输出:

    W:GPG 错误:http://cdn-fastly.deb.debian.org/debian Experimental InRelease:以下签名无法验证,因为公钥不可用:NO_PUBKEY 8B48AD6246925553 NO_PUBKEY 7638D0442B90D010
    E:存储库“http://httpredir.debian.org/debian Experimental InRelease”未签名。

    如果您看到此错误,请手动添加必要的键:

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
    
    Run Code Online (Sandbox Code Playgroud)

    在哪里8B48AD62469255537638D0442B90D010应该匹配您在警告消息中看到的公钥。

  3. 添加所需的存储库:

    sudo add-apt-repository 'deb http://httpredir.debian.org/debian experimental main'
    sudo add-apt-repository 'deb http://httpredir.debian.org/debian sid main'
    
    Run Code Online (Sandbox Code Playgroud)

    为什么不使用稳定的 Debian 存储库?您将遇到 Debian 稳定版无法满足的依赖关系。实验(对于 openjdk-7)和 sid(对于 libjpeg62-turbo、libfontconfig1 和 fontconfig-config)存储库对依赖版本更宽松。

  4. 更新apt缓存(由于 Debian 的软件包列表很大,因此预计这需要一段时间):

    sudo apt update
    
    Run Code Online (Sandbox Code Playgroud)
  5. 安装 openjdk-7-jdk:

    sudo apt install openjdk-7-jdk
    
    Run Code Online (Sandbox Code Playgroud)
  6. 更新 java 替代品。您可以查看所有已安装的 java 版本update-java-alternatives --list。要激活 OpenJDK Java 1.7,请运行:

    sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
    
    Run Code Online (Sandbox Code Playgroud)

    您可能会注意到有关IcedTeaPlugin.so插件不可用的错误。对于使用 JDK 的开发人员来说,这并不是真正关心的问题。

  7. 验证 java 是否正常工作:

    java -version
    
    Run Code Online (Sandbox Code Playgroud)

    它应该输出类似于:

    java版本“1.7.0_161”
    OpenJDK 运行时环境 (IcedTea 2.6.12) (7u161-2.6.12-1)
    OpenJDK 64 位服务器 VM(构建 24.161-b01,混合模式)

字体配置说明

libfontconfig1并且fontconfig-config必须在 Ubuntu 17.10 及更早版本上升级到 2.12 或更高版本。来自 Debian 的更新包不包含 Ubuntu 的自定义,所以一些应用程序在安装这些包后显示难看的字体;例如,Charles Web 调试代理。根据您使用的程序,您可能会或可能不会受到此问题的影响。

  • @J.Serra 用自动更新方法修改了答案。 (2认同)

Tho*_*sen 14

您可以从 Azul 下载可能适合您需求的 OpenJDK 7。它们都有一个 DEB(用于包系统)和一个 ZIP 发行版。我只使用过 ZIP 发行版。

http://www.azul.com/downloads/zulu/zulu-linux/


ger*_*ijk 6

使用容器

这是关于如何<outdated><current>Ubuntu上运行已删除软件的普遍有效的答案:容器化您的应用程序

例如,使用 Docker 和较旧的 Ubuntu 基础映像,其中您正在寻找的软件仍然可用/维护。

它也可以反过来工作;在当前运行的稳定 Ubuntu 上,在更新的甚至其他 Linux 发行版上试用该软件。

使用 Ubuntu 14.04 的 Java 7 示例

  1. 安装 Docker - Docker CE 免费版本很好。参见例如https://docs.docker.com/install/linux/docker-ce/ubuntu/或使用docker.io最近发布的 Ubuntu 版本中的包。

  2. 在一个空文件夹中,创建一个文件Dockerfile

    FROM ubuntu:trusty
    RUN apt-get update \
        && apt-get install -y \
            openjdk-7-jdk \
        && rm -rf /var/lib/apt/lists/*
    
    ENTRYPOINT ["/usr/bin/java"]
    
    Run Code Online (Sandbox Code Playgroud)

    如果需要,可以在该命令中添加更多包。

  3. 在该文件夹中,运行:

    docker build -t gertvdijk/java7 .
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用该 Java 7 映像在一次性容器中运行命令:

    例如java -version

    docker run --rm -it gertvdijk/java7 -version
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    java version "1.7.0_181"
    OpenJDK Runtime Environment (IcedTea 2.6.14) (7u181-2.6.14-0ubuntu0.1)
    OpenJDK 64-Bit Server VM (build 24.181-b01, mixed mode)
    
    Run Code Online (Sandbox Code Playgroud)
  5. (可选)为方便起见,创建一个包装器。

    • 创建一个/usr/local/bin/java7-in-docker包含内容的文件:

      #!/usr/bin/env sh -e
      
      DOCKER_IMAGE=gertvdijk/java7
      PWD="$(pwd)"
      
      exec docker run \
        --rm -it \
        -v ${PWD}:${PWD} \
        -v "/etc/passwd:/etc/passwd:ro" \
        -v "/etc/group:/etc/group:ro" \
        --user "$(id -u):$(id -g)" \
        --workdir "${PWD}" \
        "${DOCKER_IMAGE}" \
        $@
      
      Run Code Online (Sandbox Code Playgroud)

      这将使当前工作目录在容器内可用 - 而不是您的整个文件系统,它将在容器命名空间中模拟您的本地用户帐户。

    • 将其标记为可执行文件:

      sudo chmod +x /usr/local/bin/java7-in-docker
      
      Run Code Online (Sandbox Code Playgroud)
  6. 透明地运行您的 Java 7,如下所示:

    java7-in-docker -jar relative/path/to/some.jar
    
    Run Code Online (Sandbox Code Playgroud)