CLOVER🍀

That was when it all began.

CentOS/Ubuntu Linuxで、Oracle JDK 9をインストールしたDockerイメージを作る

Oracle JDK 9をインストールしてDockerイメージを作成する手順を、ちょっとメモ。

Oracle JDK 8では、2017年にダウンロード先のURLや方法が大きく変わったようです。
[Java] OracleJDKの取得方法が大きく変わりました | Developers.IO

Oracle JDK 9について言えば、URL自体は(Oracle JDK 8の変更後に比べれば)まだ単純なようです。

CentOS

作成したDockerfileは、こんな感じ。

Dockerfile

FROM centos:7

ARG jdk_version=9.0.1
ARG jdk_build_no=11
ARG jdk_rpm=jdk-${jdk_version}_linux-x64_bin.rpm

ENV JAVA_HOME /usr/java/default

RUN yum install -y wget && \
    wget -q \
         --no-check-certificate \
         --no-cookies \
         --header "Cookie: oraclelicense=accept-securebackup-cookie" \
         http://download.oracle.com/otn-pub/java/jdk/${jdk_version}+${jdk_build_no}/${jdk_rpm} && \
    rpm -ivh ${jdk_rpm}

CMD "/bin/bash"

JDK 8の頃と比べると、微妙にファイル名の形式とか変わってますね…。「_bin」とか入ってますし。
あと、JDK 8のようなハッシュ値のようなものはありませんが、JDK 8に比べるとURLの形式も微妙に異なります。

wgetを実行する時に付与するヘッダーの値などは、以前と同じようです。

ダウンロードするファイルのURLは、Oracle JDKダウンロードサイトのリンクを見ればわかるでしょう。

http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

なお、過去のバージョンをダウンロードする際に、Oracle JDK 8の時のように認証が必要になるかどうかは
確認していません。

確認。

# javac -version
javac 9.0.1


# java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

インストール場所は、「/usr/javaディレクトリ配下になります。

# ll /usr/java/jdk-9.0.1
total 32
-rw-r--r--   1 root root  158 Sep 28 03:51 README.html
drwxr-xr-x   2 root root 4096 Jan  1 15:35 bin
drwxr-xr-x   4 root root 4096 Jan  1 15:35 conf
drwxr-xr-x   3 root root 4096 Jan  1 15:35 include
drwxr-xr-x   2 root root 4096 Jan  1 15:36 jmods
drwxr-xr-x 101 root root 4096 Jan  1 15:36 legal
drwxr-xr-x  12 root root 4096 Jan  1 15:36 lib
-rw-r--r--   1 root root 1978 Sep 28 03:51 release

「/usr/java/default」や「/usr/java/latest」でも利用可能です。

# ll /usr/java/default
lrwxrwxrwx 1 root root 16 Jan  1 15:36 /usr/java/default -> /usr/java/latest


# ll /usr/java/latest
lrwxrwxrwx 1 root root 19 Jan  1 15:36 /usr/java/latest -> /usr/java/jdk-9.0.1

Ubuntu Linux

Ubuntu Linuxの場合のDockerfile。

Dockerfile

FROM ubuntu:latest

ENV JAVA_HOME /usr/lib/jvm/java-9-oracle

RUN echo oracle-java9-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    apt-get update && \
    apt-get install -y software-properties-common && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get update && \
    apt-get install -y oracle-java9-installer && \
    apt-get install -y sudo \
                       wget \
                       curl \
                       unzip \
                       vim && \
    apt-get clean

CMD "/bin/bash"

Oracle JDK 8の時と同じように、PPAと足します。

    add-apt-repository -y ppa:webupd8team/java

インストールは、「oracle-java9-installer」パッケージで行います。

    apt-get install -y oracle-java9-installer

ライセンス同意あたりは、先に設定しておきましょう。

echo oracle-java9-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections

確認。

# javac -version
javac 9.0.1


# java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

インストール場所は、「/usr/lib/jvm/java-9-oracle」となるようです。

# ll /usr/lib/jvm/java-9-oracle
total 40
drwxr-xr-x   8 root root 4096 Jan  1 15:10 ./
drwxr-xr-x   3 root root 4096 Jan  1 15:10 ../
-r--r--r--   1 root root  158 Jan  1 15:10 README.html
drwxr-xr-x   2 root root 4096 Jan  1 15:10 bin/
drwxr-xr-x   4 root root 4096 Jan  1 15:10 conf/
drwxr-xr-x   3 root root 4096 Jan  1 15:10 include/
drwxr-xr-x   2 root root 4096 Jan  1 15:10 jmods/
drwxr-xr-x 101 root root 4096 Jan  1 15:10 legal/
drwxr-xr-x  12 root root 4096 Jan  1 15:10 lib/
-rw-r--r--   1 root root 1978 Jan  1 15:10 release

Ubuntu Linux 16.04 LTSに、OpenJDK 9をインストールする

未だにJava 8でずっとやっていたのですが、いい加減にJava 9に移ろうかなと…。

対象のOSは、Ubuntu Linux 16.04 LTS。

とりあえず、「openjdk-9-jdk」パッケージをインストールしようとしてみます。

$ sudo apt-get install openjdk-9-jdk

ところが、このままだとこんなエラーで止まります。

openjdk-9-jdk:amd64 (9~b114-0ubuntu1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb の処理中にエラーが発生しました (--unpack):
 '/usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h' を上書きしようとしています。これはパッケージ openjdk-9-jdk-headless:amd64 9~b114-0ubuntu1 にも存在します

〜省略〜

処理中にエラーが発生しました:
 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

なんか、ファイルを上書きできないみたいです…。

これを回避したい場合、「-o Dpkg::Options::="--force-overwrite"」オプションをつけて上書き可能にしてインストールすればよい模様。

$ sudo apt-get install -o Dpkg::Options::="--force-overwrite" openjdk-9-jdk

apt - Can not install 'openjdk-9-jdk' because it tries to overwrite file aready included in 'openjdk-9-jdk-headless' - Ask Ubuntu

確認。

$ javac -version
javac 9-internal

$ java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)

もしくはGUI系のものが不要であれば、「openjdk-9-jdk-headless」にしてインストールすればよいかと。

$ sudo apt-get install openjdk-9-jdk-headless

現時点でのLTSであるOpenJDK 8もインストールしておきたい場合は、次のコマンドで。

$ sudo apt-get install openjdk-8-jdk

切り替えは、「update-alternatives」で。

$ sudo update-alternatives --config javac
alternative javac (/usr/bin/javac を提供) には 2 個の選択肢があります。

  選択肢    パス                                       優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-9-openjdk-amd64/bin/javac   1091      自動モード
  1            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac   1081      手動モード
  2            /usr/lib/jvm/java-9-openjdk-amd64/bin/javac   1091      手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

####################################################################################################

$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-9-openjdk-amd64/bin/java       1091      自動モード
  1            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード
  2            /usr/lib/jvm/java-9-openjdk-amd64/bin/java       1091      手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

一応、簡単なプログラムも書いてみましょうか。
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.littlewings</groupId>
    <artifactId>hello-java9</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.9</maven.compiler.source>
        <maven.compiler.target>1.9</maven.compiler.target>
    </properties>
</project>

maven.compiler.source」と「maven.compiler.target」は、「1.9」みたいです。

src/main/java/org/littlewings/example/App.java

package org.littlewings.example;

public class App {
    public static void main(String... args) {
        System.out.println("Hello World!!");
    }
}

実行。

$ mvn compile exec:java -Dexec.mainClass=org.littlewings.example.App

Hello World!!

はい、と。