通过apt-cacher-ng安装oracle-java7-installer。

我已将oracle-java7-installer ppa添加到我的apt-cacher-ng服务器和客户端。但是,我无法安装它。
你有什么办法可以解决这个问题吗?我认为它在尝试从Oracle下载安装文件时失败了。当我尝试安装时,就会出现以下情况:
admin@vgjs001:~$ sudo apt-get install oracle-java7-installer
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  gsfonts gsfonts-x11 java-common libfontenc1 libxfont1 x11-common xfonts-encodings xfonts-utils
Suggested packages:
  default-jre equivs binfmt-support visualvm ttf-baekmuk ttf-unfonts ttf-unfonts-core ttf-kochi-gothic
  ttf-sazanami-gothic ttf-kochi-mincho ttf-sazanami-mincho ttf-arphic-uming firefox firefox-2 iceweasel
  mozilla-firefox iceape-browser mozilla-browser epiphany-gecko epiphany-webkit epiphany-browser galeon midbrowser
  moblin-web-browser xulrunner xulrunner-1.9 konqueror chromium-browser midori google-chrome
The following NEW packages will be installed:
  gsfonts gsfonts-x11 java-common libfontenc1 libxfont1 oracle-java7-installer x11-common xfonts-encodings
  xfonts-utils
0 upgraded, 9 newly installed, 0 to remove and 10 not upgraded.
Need to get 4 269 kB/4 347 kB of archives.
After this operation, 7 548 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Get:1 "hyperlink-1" "repo-1" gsfonts all 1:8.11+urwcyr1.0.7~pre44-4.2ubuntu1 [3 374 kB]
Get:2 "hyperlink-2" "repo-2"  libfontenc1 amd64 1:1.1.0-1 [15,4 kB]                         
Get:3 "hyperlink-3" "repo-3"  libxfont1 amd64 1:1.4.4-1 [133 kB]                            
Get:4 "hyperlink-4" "repo-4"  x11-common all 1:7.6+12ubuntu1 [57,7 kB]                      
Get:5 "hyperlink-5" "repo-5"  xfonts-encodings all 1:1.0.4-1ubuntu1 [583 kB]                
Get:6 "hyperlink-6" "repo-6"  xfonts-utils amd64 1:7.6+1 [96,4 kB]                          
Get:7 "hyperlink-7" "repo-7"  gsfonts-x11 all 0.22 [9 108 B]                                
Fetched 3 232 kB in 33s (95,1 kB/s)                                                                                   
Preconfiguring packages ...
Selecting previously unselected package java-common.
download failed
Oracle JDK 7 is NOT installed.
dpkg: error processing oracle-java7-installer (--configure):
 subprocess installed post-installation script returned error exit status 1
Setting up gsfonts (1:8.11+urwcyr1.0.7~pre44-4.2ubuntu1) ...
Setting up libfontenc1 (1:1.1.0-1) ...
Setting up libxfont1 (1:1.4.4-1) ...
Setting up x11-common (1:7.6+12ubuntu1) ...
Setting up xfonts-encodings (1:1.0.4-1ubuntu1) ...
Setting up xfonts-utils (1:7.6+1) ...
Setting up gsfonts-x11 (0.22) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
Errors were encountered while processing:
 oracle-java7-installer
E: Sub-process /usr/bin/dpkg returned an error code (1)

我有同样的问题... - Tony
5个回答

我刚刚在处理这个问题,以下是我对Ubuntu 14.04 Trusty Tahr的研究结果。
安装程序使用apt-config来确定使用哪个代理。具体来说,如果Acquire::http::Proxy::download.oracle.com返回DIRECT,则决定是否使用默认代理或直接下载。
具体来说,安装过程运行的是:
# use apt proxy
APT_PROXIES=$(apt-config shell \
http_proxy Acquire::http::Proxy \
https_proxy Acquire::https::Proxy \
ftp_proxy Acquire::ftp::Proxy \
dl_direct Acquire::http::Proxy::download.oracle.com \
)

后来
if [ "$dl_direct" = "DIRECT" ]; then
    unset http_proxy
    unset https_proxy
    unset ftp_proxy
fi

如果您使用以下的apt配置,安装程序将直接下载:
Acquire::http::Proxy "http://my.proxy.com:3142";
Acquire::http::Proxy {
        download.oracle.com DIRECT;
};

虽然这种方法能够实现目的,但下载过程太慢有点让人烦恼,也有些违背了代理的初衷。
我发现安装程序会检查一个debconf变量来确定是否使用本地文件。被检查的属性是oracle-java8-installer/local,它是一个字符串类型。
具体而言,安装程序运行的命令是:
db_get oracle-java8-installer/local
if [ -d "$RET" -a -f "$RET"/$FILENAME ]; then

    echo "Installing from local file $RET/$FILENAME"
    cp -f -p "$RET"/$FILENAME ${FILENAME}_TEMP
    mv -f ${FILENAME}_TEMP $FILENAME
else # no local file

如果你已经下载了JDK并且放在一个目录下/jdk/dir,那么在运行安装程序之前,你需要执行以下命令:
sudo debconf-set-selections <<< 'debconf oracle-java8-installer/local string /jdk/dir/'

请注意目录末尾的斜杠“/”- 这是必需的。

谢谢你。我差不多已经通过阅读postinstall源代码的一半来弄清楚如何使用本地文件,但是你帮我省去了弄清楚如何设置配置的麻烦 - debconf的文档似乎异常不完善。我之前没有找到"debconf-set-selections",它至少有一个man页;我一直在尝试弄清楚如何使用"debconf-set",但它完全没有文档。 - Jules
这对于在一个配置了apt-cacher-ng代理的系统上安装Oracle Java 8非常有效。 - Jay Taylor
我有一个鱿鱼代理,那么在这种情况下,我该如何将链接更改为只使用鱿鱼代理? - isaaclw

我遇到了同样的问题,但是设法找到了一个解决方法。主要问题是apt-cacher-ng不会转发任何自定义的HTTP头,这些头部由Oracle安装程序(wget)使用来接受Oracle许可证。
我对我的acng.conf文件进行了以下更改。我按照GomoX的建议启用并扩展了PfilePattern子句:
PfilePattern = .*(\.d?deb|\.rpm|\.drpm|\.dsc|\.tar(\.gz|\.bz2|\.lzma|\.xz)(\.gpg|\?AuthParam=.*)?|\.diff(\.gz|\.bz2|\.lzma|\.xz)|\.jigdo|\.template|changelog|copyright|\.udeb|\.debdelta|\.diff/.*\.gz|(Devel)?ReleaseAnnouncement(\?.*)?|[a-f0-9]+-(susedata|updateinfo|primary|deltainfo).xml.gz|fonts/(final/)?[a-z]+32.exe(\?download.*)?|/dists/.*/installer-[^/]+/[0-9][^/]+/images/.*)$

并且添加(这是重要的一部分):
RequestAppendix: Cookie: oraclelicense=a

这将导致acng在每个请求中发送一个HTTP cookie,但至少可以使oracle二进制文件通过并成功完成安装。 我已经使用一些本地Docker镜像进行了测试,它们几乎瞬间下载和安装Java!
顺便说一下:我已经为acng创建了一个错误报告(#314773,不幸的是不公开),希望它会在即将发布的版本中修复...
编辑1:进一步测试发现它在Debian Jessie上运行正常,但在Ubuntu Utopic(14:10)上尚未运行...
编辑2:现在它也在Ubuntu Utopic上运行正常(问题是我使用的Docker镜像没有安装ca-certificates软件包)。

太棒了,效果很好。谢谢。 - Sirex

你可以在apt偏好设置中使用DIRECT选项,以避免通过代理传递Oracle的Java软件包。这不是一个完美的解决方案,但应该允许用户安装软件包,尽管会增加一些额外的流量。
配置片段(针对客户端计算机,而不是apt-cacher-ng服务器)如下:
Acquire::http::Proxy {
    *.oracle.com DIRECT;
};

你可以将这个内容放入/etc/apt/apt.conf.d/99proxy文件中,以确保它覆盖之前的任何apt代理配置。

不行 :/ 我也把它改成了 *.java.net,因为脚本似乎是在那里查找的,但没有成功。它仍然通过代理发送请求。 - detly
我怀疑这个脚本对HTTP代理设置进行了一些不太恰当的检测,但我还没有进行过验证。 - detly

apt-cacher-ng有一个非常严格的URL正则表达式,只允许下载某些类型的软件包。来自Oracle的Java软件包不符合它。解决方案是修改定义正则表达式的配置。

具体而言,软件包的URL类似于yada-yada.tar.gz?AuthParam=abcdacbd_123123123123,因此我们必须相应地进行调整。

基本上:

  1. /etc/apt-cacher-ng/acng.conf文件中,取消注释以PfilePattern开头的行。
  2. 将其修改为\.tar\.gz(\?AuthParam=.*)?替代\.tar\.gz

供参考,我的配置文件中完整的行如下:

PfilePattern = .*(\.deb|\.rpm|\.dsc|\.tar\.gz\.gpg|\.tar\.gz(\?AuthParam=.*)?|\.diff\.gz|\.diff\.bz2|\.jigdo|\.template|changelog|copyright|\.udeb|\.diff/.*\.gz|vmlinuz|initrd\.gz|(Devel)?ReleaseAnnouncement(\\?.*)?)$

这似乎不再适用于Oracle Java 8。 - detly
我怀疑这是由于下载器需要使用cookie而不是查询字符串来下载软件包所致。 - detly
我真的看不到解决这个问题的选项。最简单的方法可能是建立一个没有这个要求的软件包镜像(可能违反最终用户许可协议),或者从没有使用apt-cacher-ng的计算机上下载并手动导入这些软件包。 - GomoX
我在下面添加了一个不同的回复,采用了不同的方法(我保留了这个回复,因为它对类似问题应该有用)。 - GomoX

首先,您需要从终端运行以下命令来删除openjdk:
sudo apt-get purge openjdk*
如果您从任何其他PPA安装了Java 7,并且在使用Java时遇到问题,则在安装此处提到的PPA之前,您需要执行以下步骤:
sudo rm /var/lib/dpkg/info/oracle-java7-installer*
sudo apt-get purge oracle-java7-installer*
sudo rm /etc/apt/sources.list.d/*java*
sudo apt-get update

在Ubuntu 13.04/12.10/12.04中安装Oracle Java 7,打开终端并运行以下命令:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

你可以在仪表板中搜索Java来检查Java的版本。

问题是关于通过apt-cacher-ng从这个PPA安装,这会增加额外的问题,因为它充当了代理。这并没有回答问题。 - detly