Debian环境下Vagrant Up自动安装Java 8失败的问题求助
解决Vagrant Provision中Oracle Java 8安装404失败的问题
我明白你的困扰——手动SSH执行sed命令能搞定,但Vagrant自动provision就失效,核心原因其实是sed命令的执行时机不对:
当你第一次在干净的Debian虚拟机上运行provision时,/var/lib/dpkg/info/oracle-java8-installer.*这些配置文件还不存在!只有当你尝试安装oracle-java8-installer包(哪怕安装失败),dpkg才会把包内的脚本文件解压到这个目录。手动执行时你已经试过安装(失败过),文件已经存在,所以sed能生效;但首次provision时,sed执行时目标文件还没生成,等于白跑一趟,后续安装还是用旧的失效配置,自然报404。
下面给你两种可靠的自动修复方案:
方案1:先尝试安装(允许失败)再修改配置
这种方法简单直接,利用第一次安装失败后留下的配置文件进行修改:
# 添加WebUpd8 PPA源 add-apt-repository -y ppa:webupd8team/java apt-get update -y # 自动接受Oracle许可证协议,避免交互 echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections # 先尝试安装(会因旧版本地址失效失败,但会生成配置文件) apt-get install -y oracle-java8-installer || true # 现在修改已生成的配置文件 sudo sed -i 's|JAVA_VERSION=8u151|JAVA_VERSION=8u162|' /var/lib/dpkg/info/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/|' /var/lib/dpkg/info/oracle-java8-installer.* sudo sed -i 's|SHA256SUM_TGZ="c78200ce409367b296ec39be4427f020e2c585470c4eed01021feada576f027f"|SHA256SUM_TGZ="68ec82d47fd9c2b8eb84225b6db398a72008285fafc98631b1ff8d2229680257"|' /var/lib/dpkg/info/oracle-java8-installer.* sudo sed -i 's|J_DIR=jdk1.8.0_151|J_DIR=jdk1.8.0_162|' /var/lib/dpkg/info/oracle-java8-installer.* # 重新安装,此时配置已更新,能成功下载安装 apt-get install -y oracle-java8-installer oracle-java8-set-default
方案2:预下载并修改deb包(更稳健)
如果不想依赖第一次安装失败的状态,可以先下载deb包,解压修改内部脚本后再安装:
# 添加源并更新 add-apt-repository -y ppa:webupd8team/java apt-get update -y # 自动接受许可证 echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections # 创建临时目录处理deb包 mkdir -p /tmp/java-installer cd /tmp/java-installer # 下载原始deb包 apt-get download oracle-java8-installer # 解压deb包的内容和控制信息 dpkg-deb -x oracle-java8-installer*.deb . dpkg-deb -e oracle-java8-installer*.deb ./DEBIAN # 修改解压后的安装脚本(对应原包的postinst文件) sed -i 's|JAVA_VERSION=8u151|JAVA_VERSION=8u162|' ./DEBIAN/postinst 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/|' ./DEBIAN/postinst sed -i 's|SHA256SUM_TGZ="c78200ce409367b296ec39be4427f020e2c585470c4eed01021feada576f027f"|SHA256SUM_TGZ="68ec82d47fd9c2b8eb84225b6db398a72008285fafc98631b1ff8d2229680257"|' ./DEBIAN/postinst sed -i 's|J_DIR=jdk1.8.0_151|J_DIR=jdk1.8.0_162|' ./DEBIAN/postinst # 重新打包修改后的deb包 dpkg-deb -b . modified-oracle-java8-installer.deb # 安装修改后的包并处理依赖 dpkg -i modified-oracle-java8-installer.deb apt-get install -f -y # 安装默认环境包 apt-get install -y oracle-java8-set-default # 清理临时文件 rm -rf /tmp/java-installer
把上述任意一种方案替换到你的Vagrant shell脚本中,再执行vagrant up就能实现完全自动的Java 8安装,无需手动干预。
内容的提问来源于stack exchange,提问作者Greco Jonathan
相关产品推荐
相关产品推荐

