自动安装Java(带有静默选项)


104

我正在尝试通过apt-get安装Java。

我找到了该Java安装程序的PPA,但是,当我添加存储库,更新并发出apt-get install -y命令时,java的安装程序将接管并弹出配置选项。

我希望能够在没有任何干预或按下键盘的情况下进行安装,因为我正在为我的EC2实例创建构建和部署脚本,该脚本将自动安装它所需的所有带标签的软件包。

还有其他选择吗?

Answers:


147

如果OpenJDK / OpenJRE适合您,则我建议使用@SAM推荐的软件包。但是,某些软件确实需要Oracle的JDK / JRE。该答案是如何使用PPA中的Oracle软件包使许可证问题保持沉默。

首先,让我们认识到问题是开发人员创建的软件包的功能

oracle-java7-installer (7u7-0~webupd8~4) maverick; urgency=medium

  * removed cookie file use or else the PPA stays disabled
  * request the user to accept the Oracle license before installation
 -- Alin Andrei <webupd8@gmail.com>   Tue, 04 Sep 2012 14:18:29 +0200

正如@Nate在回答中指出的那样,应该有一个静默选项。还有。在安装之前执行以下操作:

$ echo debconf shared/accepted-oracle-license-v1-1 select true | \
  sudo debconf-set-selections
$ echo debconf shared/accepted-oracle-license-v1-1 seen true | \
  sudo debconf-set-selections

这会将debconf键的值设置为true,但也将其标记为用户可见。现在这个问题不应该出现!

我是怎么找到这个的?

在软件包的源代码中,我在oracle-java7-installer.preinst文件中对此进行了跟踪:

license=oracle-license-v1-1

# snip

db_get shared/accepted-$license
if [ "$RET" = "true" ]; then
    echo "$license license has already been accepted" >&2
    exit 0
fi

显然,它使用debconf的值作为密钥shared/accepted-oracle-license-v1-1来检查用户是否已经接受了许可证。如果是这样,脚本将正常退出并允许安装继续进行而不会询问您问题。现在,我们应该告诉debconf您已经接受Oracle许可证1.1。

请参考的手册页debconf-set-selections以获取更多详细信息,但这是您所遇到问题的示例,并且对于其他软件包也是如此。您在系统中的debconf数据库中还有哪些其他键?安装debconf-utils并执行

$ sudo debconf-get-selections

然后grep获取更多您需要在自动安装中设置的密钥。这比使用-ywith 更灵活,apt-get因为它使您有机会在安装时间设置默认设置以外的其他设置。


9
很棒的答案。:)
Layke

3
很棒的答案。也可以从Shell脚本工作。
德里克(Derek)


许可证接受命令的回声不需要引号吗?
大卫·

1
@David不是这种情况;如果将它们添加在一起,它们的输出echo将完全相同。
gertvdijk

55

使用WebUpd8团队的PPA静默安装Java 6/7/8/9

sudo apt-get install -y python-software-properties debconf-utils
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections
sudo apt-get install -y oracle-java8-installer

@gertvdijk答案不适用于Ubuntu 14.04和14.10


1
在16.04上效果很好
气动装置

这不再起作用了
Ahmed Mostafa

@AhmedMostafa可以让其他人知道您在哪里尝试过此方法。
拉胡尔·塔库尔

1
工程oracle-java9-installer太。
Kohányi罗伯特·

1
这项工作与基于google / cloud-sdk的图片完美配合
Xin Meng

13

支持@gertvdijk的答案原始博客文章中有关webupd8的PPA的描述。

更新2:安装程序现在要求您在安装开始之前接受Oracle许可证。只需要一次。如果出于某种原因需要自动化安装,则可以运行以下命令以自动接受Oracle许可证:

sudo echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | \
sudo /usr/bin/debconf-set-selections

这就是我无声安装Oracle Java所需的魔力-感谢@Hosam
Phantomwhale 2014年

不客气@Phantomwhale
Hosam Aly

我是否弄错了,或者答案中缺少“ /”字符?
大卫·

11

我使用docker ubuntu16.04LTS为我验证了以下句子的工作。

RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:webupd8team/java && apt-get update

RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections

RUN apt-get install -y oracle-java8-installer

我试过了,但是没有用。
艾哈迈德·莫斯塔法

确认在Kubuntu 18.04上的docker-ce 18.05上为我工作:D安装在i386/ubuntu:18.04容器中。
BeepDog

2

对于静默的 Java安装,您可以尝试open-jdk:

须藤apt-get install -y openjdk-7-jdk

也可以尝试此操作以获得更多open-jdk软件包/扩展...

sudo apt-cache搜索openjdk


该解决方案效果很好。sudo apt-get install -y openjdk-7-jdk
Layke 2012年


0

这是我用来成功构建基于Debian的Docker映像的Dockerfile的摘录:

参考

RUN apt-get update \
    && apt-get upgrade \
    && apt-get install -y gnupg

RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list
RUN echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
RUN apt-get update
RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections
RUN apt-get install -y oracle-java8-installer \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && R CMD javareconf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.