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

我想将我的主系统升级到16.04,但是我在进行需要OpenJDK 7的项目。显然,通过简单的apt-get install openjdk-7-jdk命令无法获得它。仓库中只列出了版本8和9。
有人可以指导我如何安装吗?

如果有人想知道为什么你仍然需要JDK 7,我和你一样处于同样的情况,因为我认为neo4j 2.1.6在Ubuntu 16.04上运行不正常,唯一可能出错的地方就是JDK。 - Sridhar Sarnobat
你是否明确要求系统 JVM 使用 openjdk 7,还是只需要 Java 7 运行时?你可以从 Oracle 档案库下载后者。 - Thorbjørn Ravn Andersen
在这里,我回答了如何在较新的Ubuntu上安装Java 7或8。这个答案还解决了“PPA已停用”的问题。 - Cadoiz
8个回答

安全警告

下面提到的PPA中的软件包没有更新Java的安全补丁。请勿在生产环境中使用,而是查看替代方案。

截至撰写本文时,OpenJDK 7的最后一次上传是在'2016-04-22',版本为7u95,并仍然可用作'latest',而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  

这将“PPA for OpenJDK uploads (restricted)”定义为一个额外的软件包仓库,更新您的信息,并安装该软件包及其依赖项(从该仓库中)。

13如果你不小心先安装了openjdk-8(就像我一样),那么在按照这个答案的步骤后,你需要运行sudo update-java-alternatives命令,以便将openjdk-7设置为默认选项。 - Rian Sanderson
似乎缺少tzdata-java软件包,因此安装没有时区支持。 - sfussenegger
6FYI: 目前这不适用于16.10版本。 - opticyclic
20-1 因为这个 PPA 完全过时,忽视了许多重要的安全补丁。我认为这样安装是完全不能接受的。 - gertvdijk
3也不适用于17.04版本。 - Colin Harrington
2-1也如PPA建议的那样是受限制的,并且没有得到及时更新。 - delimiter
PPA最近移除了xential的jdk-8,但替换为了jdk-9。 - Dennis C
1@gertvdijk 够了,别再说“PPA已经过时”的废话了。我们从哪里可以获取风险更低的版本? - Neon Warge
@NeonWarge 或许你会在其他回答中找到一个更少安全风险的版本。也许吧。可能性存在。 - MDMower
3这个解决方案不再适用。包openjdk-7-jdk不可用,但被另一个包所引用。 这可能意味着该包已丢失、已过时, 或者只能从其他来源获取。E: 包'openjdk-7-jdk'没有可安装的候选项。 - Nam Nguyễn
1这个答案似乎也已经过时了。也许你可以考虑阅读这个帖子,其中我解释了如何在较新的Ubuntu上安装Java 7或8(链接:https://askubuntu.com/a/1161572/830570)。这个答案也能解决"PPA DISCONTINUED"的问题。 - Cadoiz

编辑于2019年7月22日:此答案目前无法使用。下面提到的JDK软件包在Debian Experimental上已不再可用。无论如何,它们落后于Ubuntu Trusty的软件包,后者包含了更近期的安全更新。在此问题得到解决之前,请参考其他答案(抱歉,暂无预计完成时间)。


看起来 openjdk-r/ppa 的维护者不会更新 openjdk-7 软件包的版本,超过 7u95-2.6.4-3。该软件包的描述 "从 Debian GNU/Linux 的主要存档中复制自 debian experimental" 给了我们一个关于如何自行处理的线索。

选项1:手动安装

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

  2. 使用dpkg尝试安装软件包:

    Ubuntu 17.10及更早版本:

    sudo dpkg -i openjdk-7-* libjpeg62-turbo* libfontconfig1* fontconfig-config*
    

    Ubuntu 18.04及更高版本:

    sudo dpkg -i openjdk-7-* libjpeg62-turbo*
    
  3. 检查dpkg的输出。如果存在依赖关系问题-这很可能会发生-则您将看到以下内容(将您的架构替换为amd64):

    Errors were encountered while processing:
    openjdk-7-jre:amd64
    openjdk-7-jre-headless:amd64
    openjdk-7-jdk:amd64

    如果没有依赖关系问题,则很好,您已经完成了,跳到#4。否则,如果您需要解决一些依赖关系问题,则可以使用以下命令处理:

    sudo apt install -f
    

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

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

    sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
    

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

  5. 验证Java是否正在工作:

    java -version
    

    应输出类似于以下内容:

    java version "1.7.0_161"
    OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1)
    OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)
选项2:自动安装(包括使用apt更新) 固定 可用于从Debian存储库安装和更新 openjdk-7-jdk 及其依赖项。
创建一个固定文件,告诉apt只考虑我们感兴趣的软件包(我们肯定不希望整个Ubuntu发行版被Debian实验性软件包“升级”)。
创建文件/etc/apt/preferences.d/debian,并将以下内容添加到其中。您需要超级用户权限,所以可以使用sudo vim、sudo nano、gksudo gedit等命令。
软件包:* Pin: release o=Debian,n=experimental Pin-Priority: -1
软件包:* Pin: release o=Debian,n=sid Pin-Priority: -1
软件包:openjdk-7-jdk Pin: release o=Debian,n=experimental Pin-Priority: 500
软件包:openjdk-7-jre Pin: release o=Debian,n=experimental Pin-Priority: 500
软件包:openjdk-7-jre-headless Pin: release o=Debian,n=experimental Pin-Priority: 500
软件包:libjpeg62-turbo Pin: release o=Debian,n=sid Pin-Priority: 500
对于Ubuntu 17.10及更早版本,还需追加以下内容(请参阅底部的注释):
软件包:libfontconfig1 Pin: release o=Debian,n=sid Pin-Priority: 500
软件包:fontconfig-config Pin: release o=Debian,n=sid Pin-Priority: 500
安装Debian密钥环:
sudo apt install debian-archive-keyring
注意:虽然这是添加Debian密钥环的最简单方法,但可能不是最新的。在第4步运行apt update时,请检查是否有以下输出:
W: GPG error: http://cdn-fastly.deb.debian.org/debian experimental InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8B48AD6246925553 NO_PUBKEY 7638D0442B90D010 E: The repository 'http://httpredir.debian.org/debian experimental InRelease' is not signed.
如果看到此错误,则可以使用以下命令手动添加所需的密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
其中8B48AD6246925553和7638D0442B90D010应与警告消息中显示的公钥匹配。
添加所需的软件源:
sudo add-apt-repository 'deb http://httpredir.debian.org/debian experimental main' sudo add-apt-repository 'deb http://httpredir.debian.org/debian sid main'
为什么不使用稳定的Debian软件源?因为Debian稳定版会出现无法满足依赖关系的问题。实验性(用于openjdk-7)和sid(用于libjpeg62-turbo、libfontconfig1和fontconfig-config)软件源对依赖版本更宽松。
更新apt缓存(由于Debian的软件包列表很大,所以这可能需要一些时间):
sudo apt update 安装openjdk-7-jdk:
sudo apt install openjdk-7-jdk
更新Java备选项。您可以使用update-java-alternatives --list命令查看所有已安装的Java版本。要激活OpenJDK Java 1.7,请运行以下命令:
sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
您可能会注意到有关IcedTeaPlugin.so插件不可用的错误。对于使用JDK的开发人员来说,这并不是真正的问题。
验证Java是否正常工作:
java -version
输出应类似于:
java version "1.7.0_161" OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1) OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)

fontconfig注意事项

libfontconfig1fontconfig-config必须在Ubuntu 17.10及更早版本上升级到2.12或更高版本。来自Debian的更新包不包含Ubuntu的定制内容,因此安装了这些软件包后,某些应用程序会显示丑陋的字体;例如Charles Web Debugging Proxy。根据您使用的程序,您可能会受到此问题的影响或不受影响。


有趣的回答,请在找到一种自动更新此软件包的方法后更新它。 - J.Serra
我刚刚尝试在Ubuntu 16.04上安装JDK 7,这是我成功安装的唯一方法。谢谢! - link
2@J.Serra 答案已修订,采用自动更新方法。 - MDMower
非常感谢您的完美回答,特别是自动翻译方法非常受赞赏!感谢您花时间去弄清楚并写下来! - steadfasterX
1自动方法对我来说大部分都有效,但也并非完全永久。除了libjpeg62-turbo之外,我还需要在/etc/apt/preferences.d/debian中添加另外两个软件包:libfontconfig1和fontconfig-config。 - comodoro
看起来openjdk-7-jre版本7u151将libfontconfig1的版本要求提高到2.12,适用于许多平台(包括i386和amd64),这反过来又需要fontconfig-config >= 2.12.3-0.2。感谢您提醒,并感谢@tim-schumacher已经对这个答案进行了编辑! - MDMower
刚试了自动方法。它给出了"openjdk-7-jdk : 依赖于 openjdk-7-jre (= 7u161-2.6.12-1) E: 无法修复问题,您有损坏的软件包。" - John Rose
@JohnRose 你能提供更多的信息吗?你的操作系统是什么?你复制了整个固定文件,而不仅仅是其中的一部分吗?并且确认它保存在正确的位置了吗?我刚刚卸载了OpenJDK 7,并将剩余的Debian软件包恢复为Ubuntu软件包,然后重新开始安装,一切都进行得很顺利。 - MDMower
Ubuntu 16.04。我已经复制了整个固定文件,并检查它是否保存在正确的位置。随后,我使用了手动安装方法(即选项1),这一切都进行得很顺利,尽管我确实需要执行sudo apt install -f来解决依赖关系(如选项中所指示)。 - John Rose
感谢信息,@JohnRose。我正在使用Ubuntu 17.10,所以今晚我会在Ubuntu 16.04上进行测试,并查看是否有需要升级的额外软件包。 - MDMower
你真棒!我尝试了几个小时的其他方法,而你的自动方式是唯一有效的(我用的是18.04)。真心感谢 :) - protoEvangelion
这个方法不再起作用了 :( 我在18.04版本上。 - Nam Nguyễn
哎呀,真糟糕,看起来Debian移除了实验性的JDK软件包。我想我们得去寻找另一个解决方案了。我会将这个标记为“目前无法使用”。 - MDMower
也许你可以考虑这个链接,我在其中解答了如何在更新版本的Ubuntu上安装Java 7或8。这个答案还解决了“PPA已停用”的问题。 - Cadoiz


1这是我在最新版本的Ubuntu上使用的方法。 - razvanone

使用容器

这是一个普遍适用的答案,关于如何在当前的Ubuntu上运行已过时的软件:将您的应用程序容器化

例如,使用Docker和一个旧版本的Ubuntu基础镜像,在其中您要寻找的软件仍然可用/维护。

反过来也是可以的;您可以在当前稳定的Ubuntu上尝试在更新的或者其他Linux发行版上运行该软件。

以Java 7为例,使用Ubuntu 14.04

  1. 安装Docker - Docker CE免费版本就可以了。例如,参考https://docs.docker.com/install/linux/docker-ce/ubuntu/或者使用最新的Ubuntu版本中提供的docker.io软件包。

  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"]
    

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

  3. 在该文件夹中运行以下命令:

    docker build -t gertvdijk/java7 .
    
  4. 在使用Java 7镜像的单次使用容器中运行命令:

    例如:java -version

    docker run --rm -it gertvdijk/java7 -version
    

    输出结果:

    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)
    
  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}" \
        $@
      

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

    • 将其标记为可执行:

      sudo chmod +x /usr/local/bin/java7-in-docker
      
  6. 像这样透明地运行Java 7:

    java7-in-docker -jar relative/path/to/some.jar
    

14.04已不再提供维护服务,除非您支付额外的维护费用(直至2022年)。 - Thorbjørn Ravn Andersen
GUI应用程序也需要额外的努力 - Thorbjørn Ravn Andersen

Oracle JDK替代方案:

我想避免使用软件源的麻烦,因为我需要在7、8和9之间切换,所以我选择了Oracle JDK而不是OpenJDK。从官方网站下载的。我不确定最新的构建80是否包含与OpenJDK的构建161相同的修复程序。但对于我的开发来说,这并不重要。

然后您需要在环境中设置$JAVA_HOME,以便各种脚本选择正确的JDK(例如Maven、JBoss等)。

为了完整起见,JDK 7已经终止支持,甚至自2017年9月起停止JDK 8的公共支持,并将在2018年9月后不再获得公共更新。


在Ubuntu 16.04和Ubuntu 17.04上安装Java 7。

建议安装Oracle Java,因为它比OpenJDK具有更好的性能。出于这个原因,我想提供一种替代方法。如果您想安装Oracle Java,请在终端中运行以下命令从PPA安装它。

  1. 添加所需的软件源:

    sudo add-apt-repository ppa:webupd8team/java
    
  2. 更新 apt 缓存并安装 oracle-java7

    sudo apt update
    sudo apt install java-common oracle-java7-installer
    

    在安装过程中,您需要接受 Oracle 许可协议。安装完成后,我们需要设置 Java 环境变量,如 JAVA_HOME

  3. 更正 Java 环境变量。

    sudo apt install oracle-java7-set-default
    source /etc/profile
    
  4. 验证 Java 是否正常工作:

    java -version
    

    输出应类似于以下内容:

    java version "1.7.0_80"
    Java(TM) SE Runtime Environment (build 1.7.0_80-u80)
    Java HotSpot(TM) 64-Bit Server VM (build 25.131-u80, mixed mode)
    

3Oracle安装程序不再起作用 正在连接到download.oracle.com (download.oracle.com)|184.51.150.144|:80... 连接成功。 发送HTTP请求,等待响应... 404 Not Found - autonomy
对于Oracle JDK,该公司不提供JDK 7的公共支持(他们提供付费支持)。我认为apt-get试图从不存在的页面获取安装程序。--如果您需要JDK 7,则可以从存档网站下载安装程序:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html - Jaime

一个简单的方法是:
将以下行添加到:/etc/apt/sources.list 文件中:
deb http://security.ubuntu.com/ubuntu trusty main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

然后更新apt并安装。您可能需要降级tzdata软件包。
之后,我建议注释掉那些行,并再次进行apt更新,以防止从该存储库安装或更新软件包(这可能导致意外行为)。
一个问题是,您需要保留这些软件包,以便在更新系统时不被删除(特别是tzdata软件包)。
注意:请将此方法作为最后的手段,优先选择其他任何可以无问题更新的方法。

1这个方法有效,并且是2022年唯一仍然有效的答案。 - Joel Coehoorn
Ubuntu 18 安装 Open JDK 7 以构建 AOSP 6.0;这个方法对我有效。 - Tom

以下方法适用于我在Ubuntu 18.04上的操作。
apt-get update && apt-get install default-jdk