CLOVER🍀

That was when it all began.

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」で。

kazuhira@ikaruga-ubuntu:~$ 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!!

はい、と。