JDK 8未安装 - 错误404:未找到

44

从昨天开始,我一直在尝试在我的Ubuntu机器上安装JDK8,但是一直失败。

我一直在尝试运行以下命令:

sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default

但我无法继续,因为当运行命令 sudo apt-get install oracle-java8-installer 时我只得到:

...
Connecting to download.oracle.com (download.oracle.com)|23.215.130.99|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2017-10-18 11:07:34 ERROR 404: Not Found.

download failed
Oracle JDK 8 is NOT installed.
dpkg: error processing package oracle-java8-installer (--configure):
 subprocess installed post-installation script returned error exit status 1
...

我的设置是一台64位的Ubuntu 14.04。

13个回答

89
经过大量的谷歌搜索,我在Ubuntu论坛上找到了答案。

基本上,问题似乎是由于有一个新的Java版本,而安装程序没有更新以引用它。

如果您的机器是带有AMD64处理器的Linux x64,您需要最新的Java8版本,并且您之前安装了8u212版本,则可以通过运行以下命令轻松解决此问题(原始版本由g1zmo2提供):

cd /var/lib/dpkg/info
sudo sed -i 's|JAVA_VERSION=8u212|JAVA_VERSION=8u221|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=https://download.oracle.com/otn/java/jdk/8u212-b10/59066701cf1a433da9770636fbc4c9aa/|PARTNER_URL=https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ=.*|SHA256SUM_TGZ="15ad4f7260d2416ac1558341d9d0a0ec5b83904e4ac4a22c8a3242e4e217649b"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_212|J_DIR=jdk1.8.0_2221|' oracle-java8-installer.*

然后像平常一样运行JDK 8安装程序命令 =):

sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default

如果您的机器不是Linux x64 AMD64,您之前的版本不是8u212或者您正在寻找Java 9,那么你运气真好。今天您将学会如何为自己的需求修复Java安装程序。

在本教程中,我们假设您想要Java 8u181,并且您之前已经安装了Java 8u171(因为这就是我所拥有的)。

首先,我需要您前往Java的JDK下载页面(对于Java8,请点击此处,点击“Downloads”选项卡,然后点击“Java SE 8u181”链接)。

现在,根据您的机器查找所需的JDK版本。在我的情况下,我的机器运行在Ubuntu 14.04 64位上,因此我需要“Linux x64”。

JDK versions

复制带您到所需下载的链接。不要忘记接受许可协议。在我的情况下(Linux x64),我需要:http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz

在本教程中,我们只需要链接的路径:http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/。保持它的安全性;我们稍后会需要它。

现在在页面中查找校验和链接并点击它

Checksum link

这应该会带您到一个普通的html表格页面。只需查找适合您机器的sha256

Linux x64 SHA

再次提醒,我的机器是"Linux x64",所以我需要像图片中一样的1845567095bfbfebd42ed0d09397939796d05456290fb20a83c476ba09f991d3。复制这个值并妥善保管;之后我们还会用到它。
现在,在您的机器上打开终端并进入Java安装程序文件所在的文件夹。
cd /var/lib/dpkg/info

太好了,现在执行以下命令:
sudo grep --color -P "JAVA_VERSION=[a-z0-9]+" oracle-java8-installer.config

输出结果应该类似于这样:

Installer's java version

这告诉我们安装程序配置的Java版本是什么。因此,要轻松更改这些值,我们可以运行以下命令:
sudo sed -i 's|JAVA_VERSION=<INSTALLER CURRENT JAVA VERSION HERE>|JAVA_VERSION=<NEW VERSION HERE>|' oracle-java8-installer.*

对于我们的情况,我们正在从8u171升级到8u181,因此我们需要执行以下操作:

sudo sed -i 's|JAVA_VERSION=8u171|JAVA_VERSION=8u181|' oracle-java8-installer.*

好的,现在我们需要更新下载链接。
sudo grep --color -P "PARTNER_URL=[^ ]+" oracle-java8-installer.config

安装程序的合作伙伴 URL

要更新它,我们需要执行类似于这样的命令:

sudo sed -i 's|PARTNER_URL=<INSTALLER CURRENT JAVA URL HERE>|PARTNER_URL=<NEW URL HERE>|' oracle-java8-installer.*

记得我在一开始告诉你要保存的URL吗?现在我们需要它。将它作为您的新URL,像这样:

sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/|' oracle-java8-installer.*

接下来,我们需要更新校验和。请执行以下命令:

sudo grep --color -P '[^#]SHA256SUM_TGZ="[^"]+"' oracle-java8-installer.config

这会打印出几个不同的SHA256:

Installer's SHA256s

请注意它们都是不同的。我们稍后会回到这个问题。所以,要更新SHA256,我们需要执行以下命令:

sudo sed -i 's|SHA256SUM_TGZ="<INSTALLER CURRENT JAVA HASH HERE>"|SHA256SUM_TGZ="<NEW JAVA HASH>"|' oracle-java8-installer.*

但是,我们如何知道要替换哪个当前的Java哈希?好吧,我们需要找出我们处理器的架构:

dpkg --print-architecture

在我的情况下,这将输出amd64。这意味着我应该获取第二个链接。我怎么知道的?好吧,我读了源代码(sudo gedit oracle-java8-installer.config),所以请相信我:

  • 如果您的架构是i386i586i686,则获取第一个。
  • 如果是amd64,则获取第二个。
  • 如果是armv7larmv6l,则获取第三个。
  • 如果是armv8larm64aarch64,则获取第四个。
  • 如果以上都不是,那就没戏了...

因此,由于我的架构是amd64,使用我们从Java网站获得的新哈希,我将执行以下操作:

sudo sed -i 's|SHA256SUM_TGZ="b6dd2837efaaec4109b36cfbb94a774db100029f98b0d78be68c27bec0275982"|SHA256SUM_TGZ="1845567095bfbfebd42ed0d09397939796d05456290fb20a83c476ba09f991d3"|' oracle-java8-installer.*

最后,我们需要修改安装程序JDK目录名称,因此执行以下命令查找当前目录名称:
sudo grep --color -P "J_DIR=[^ ]+" oracle-java8-installer.config

在我的情况下,这样打印出来:

Installer's JDK folder name

因此,我们需要执行类似于以下内容的操作:
sudo sed -i 's|J_DIR=<INSTALLER CURRENT JDK VERSION HERE>|J_DIR=<NEW JDK VERSION>|' oracle-java8-installer.*

我的当前版本是jdk1.8.0_171,我执行以下命令:

sudo sed -i 's|J_DIR=jdk1.8.0_171|J_DIR=jdk1.8.0_181|' oracle-java8-installer.*

好的,我们已经准备好调用Java安装程序了,耶!(呼...这比我一开始想的要花更长时间打字)。


2
8u151-1webupd80的修复: - Albert Zhong
1
似乎又遇到了过时的问题,使用java 8u161(404未找到),请问有没有最新的解决方案? - Thomas
1
是啊,有点糟糕 =\ 我可以做一个手动指南 =),但有时候一个Linux新手只是需要复制粘贴命令来帮助自己(我之前也是这样),最好能兼顾两者,请多谢您的建议。=) - cavpollo
1
@GeorgeV.M. 完成了 ^_^ 如果您有其他建议,请告诉我。 - cavpollo
1
我尝试将它在8u211和8u212上都运行起来,但失败了。我注意到下载的URL现在使用https和otn而不是otn-pub。尝试这样做只会显示未授权而不是未找到。我不确定最近的许可证更改是否是一个因素? - Sean Fausett
显示剩余5条评论

10

感谢cavpollo提供JDK 8u141的答案。

我将为JDK 8u151-1〜webupd8〜0提供修复方法(请改用JDK 8i162):

cd /var/lib/dpkg/info
sudo sed -i 's|JAVA_VERSION=8u151|JAVA_VERSION=8u162|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ="c78200ce409367b296ec39be4427f020e2c585470c4eed01021feada576f027f"|SHA256SUM_TGZ="68ec82d47fd9c2b8eb84225b6db398a72008285fafc98631b1ff8d2229680257"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_151|J_DIR=jdk1.8.0_162|' oracle-java8-installer.*

8
今天我使用Oracle从8u181升级到8u191时遇到了问题。按照@cavpollo的步骤进行操作后,成功解决了问题。以下是针对181到191版本的修复方法,供有需要的人参考:
cd /var/lib/dpkg/info
sudo sed -i 's|JAVA_VERSION=8u181|JAVA_VERSION=8u191|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ="1845567095bfbfebd42ed0d09397939796d05456290fb20a83c476ba09f991d3"|SHA256SUM_TGZ="53c29507e2405a7ffdbba627e6d64856089b094867479edc5ede4105c1da0d65"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_181|J_DIR=jdk1.8.0_191|' oracle-java8-installer.*

1
感谢您使用这个更新版本。很高兴知道教程对您有用 =) - cavpollo
太好了,非常感谢您制作如此详细的教程!它非常有效! - MinneapolisCoder9

6

由于最新的Java发行版,此解决方法已经过时,建议使用以下替代方案:

sed -i 's|JAVA_VERSION=8u151|JAVA_VERSION=8u162|' oracle-java8-installer.*
sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/|' oracle-java8-installer.*
sed -i 's|SHA256SUM_TGZ="c78200ce409367b296ec39be4427f020e2c585470c4eed01021feada576f027f"|SHA256SUM_TGZ="68ec82d47fd9c2b8eb84225b6db398a72008285fafc98631b1ff8d2229680257"|' oracle-java8-installer.*
sed -i 's|J_DIR=jdk1.8.0_151|J_DIR=jdk1.8.0_162|' oracle-java8-installer.*

谢谢。今天星期五我在加班,因为我的ansible Web服务器部署playbook不能再安装Java到主机上了。很可能是因为Oracle不允许供应商重新分发他们甚至不收费的二进制文件。好像没有足够的理由转向开源替代品。 - Idris

6

针对于2019年4月16日对于Linux x64上的AMD64,从版本8u201更新至8u211所做的更改如下:

cd /var/lib/dpkg/info
sudo sed -i 's|JAVA_VERSION=8u201|JAVA_VERSION=8u211|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/|PARTNER_URL=https://download.oracle.com/otn/java/jdk/8u211-b12/478a62b7d4e34b78b671c754eaaf38ab/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ="cb700cc0ac3ddc728a567c350881ce7e25118eaf7ca97ca9705d4580c506e370"|SHA256SUM_TGZ="c0b7e45330c3f79750c89de6ee0d949ed4af946849592154874d22abc9c4668d"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_201|J_DIR=jdk1.8.0_211|' oracle-java8-installer.*

虽然在我的情况下我不需要使用sudo,但为了与这里其他回复保持一致,我仍然保留了它。

感谢@cavpollo


我自己找到了这组命令。尝试了你的,但是在两种情况下都出现了HTTP“401需要授权”的错误。 - macaco
我在这里,2019年4月17日。这些不可靠的安装程序到底是怎么回事。他们的行为如此鲁莽。全球一半的人都依赖它。教训就是备份所有东西。 - PedroD
我怀疑401错误是因为8u211是仅付费的第一个版本。之前的8u201是最后一个免费可用的版本。在我看来,8u201版本引用的tarball已经从Oracle的服务器中删除了? - tastyCIDR
我正在尝试将此添加到我的dockerfile中,但是我一直收到这个错误sed: can't read oracle-java8-installer.*: No such file or directory。对此有什么想法吗? - demouser123
我最终将8u202 .tar.gz存储在S3中,并更改了sed命令,使其指向公共S3存储桶中的位置,这样做效果很好。 - tastyCIDR

5
以下是我在Ubuntu Mate 16.04 x64上的解决方法:
wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jdk-8u152-linux-x64.tar.gz

mkdir /opt/jdk

sudo tar -zxf jdk-8u152-linux-x64.tar.gz -C /opt/jdk

update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_152/bin/java 100

update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_152/bin/javac 100

感谢digital ocean提供的标题调整。


4
这里提供 Java 8u181 的下载,因为 8u171 已经不可用了。
cd /var/lib/dpkg/info
sed -i 's|JAVA_VERSION=8u171|JAVA_VERSION=8u181|' oracle-java8-installer.*
sed -i 's|J_DIR=jdk1.8.0_171|J_DIR=jdk1.8.0_181|' oracle-java8-installer.*
sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/|' oracle-java8-installer.*
sed -i 's|SHA256SUM_TGZ="b6dd2837efaaec4109b36cfbb94a774db100029f98b0d78be68c27bec0275982"|SHA256SUM_TGZ="1845567095bfbfebd42ed0d09397939796d05456290fb20a83c476ba09f991d3"|' oracle-java8-installer.*

2
谢谢提供更新版本,我已经将原始答案进行了更新,包含了它=) - cavpollo

3

还有一个更新的版本:

cd /var/lib/dpkg/info
sudo sed -i 's|JAVA_VERSION=8u161|JAVA_VERSION=8u171|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ="6dbc56a0e3310b69e91bb64db63a485bd7b6a8083f08e48047276380a0e2021e"|SHA256SUM_TGZ="b6dd2837efaaec4109b36cfbb94a774db100029f98b0d78be68c27bec0275982"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_161|J_DIR=jdk1.8.0_171|' oracle-java8-installer.*

谢谢提供更新版本,我已经更新了原始答案以包含它 =) - cavpollo
太棒了。如果这将成为一种常见的事情,我们应该记录如何生成这些哈希值。 - Kenny Hung
这是一个非常好的想法。你可以在SO上提出自己的问题并回答它。我会从这个问题中链接到它=) - cavpollo

2

我来和你分享一下JDK 8u172版本的更新

sudo sed -i 's|JAVA_VERSION=8u161|JAVA_VERSION=8u172|' oracle-java8-installer.*
sudo sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u172-b11/a58eab1ec242421181065cdc37240b08/|' oracle-java8-installer.*
sudo sed -i 's|SHA256SUM_TGZ="6dbc56a0e3310b69e91bb64db63a485bd7b6a8083f08e48047276380a0e2021e"|SHA256SUM_TGZ="28a00b9400b6913563553e09e8024c286b506d8523334c93ddec6c9ec7e9d346"|' oracle-java8-installer.*
sudo sed -i 's|J_DIR=jdk1.8.0_161|J_DIR=jdk1.8.0_172|' oracle-java8-installer.*

谢谢更新的版本,我已经更新了原始答案以包含它 =) - cavpollo
根据@Pavlo的说法,这只安装了8u171版本。我在8u171版本上亲自测试过,没有任何更新。 - cavpollo
抱歉,cavpollo,这是因为“WebUpd8”团队在几个小时前将版本从8u161更新到8u171。这将不再正确地替换字符串。这是昨天错误的修补程序,但我认为你可以使用@kenny-hung发布的8u171 SHA和URL,而不是8u161版本。 =) - al3gom3z

2
的回答已经很好了,对于那些使用Ansible的用户来说,这个任务可以帮助你实现目标。
- name: Patch Java installer
  shell: "{{ item }}"
  args:
    chdir: "/var/lib/dpkg/info"
  become: yes
  with_items:
    - sed -i 's|JAVA_VERSION=8u144|JAVA_VERSION=8u152|' oracle-java8-installer.*
    - sed -i 's|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/|PARTNER_URL=http://download.oracle.com/otn-pub/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/|' oracle-java8-installer.*
    - sed -i 's|SHA256SUM_TGZ="e8a341ce566f32c3d06f6d0f0eeea9a0f434f538d22af949ae58bc86f2eeaae4"|SHA256SUM_TGZ="218b3b340c3f6d05d940b817d0270dfe0cfd657a636bad074dcabe0c111961bf"|' oracle-java8-installer.*
    - sed -i 's|J_DIR=jdk1.8.0_144|J_DIR=jdk1.8.0_152|' oracle-java8-installer.*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接