わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

UbuntuでOracle Java 9を使う

要約がわりのコマンド一覧:

  • sudo -i
  • add-apt-repository ppa:webupd8team/java
  • apt update
  • apt upgrade
  • apt install default-jre
  • apt install oracle-java8-installer
  • apt install oracle-java9-installer
  • update-alternatives --config java
  • update-alternatives --config javac
  • update-alternatives --config javaws
  • java -version
  • jshell


WEB+DB PRESS Vol.101

WEB+DB PRESS Vol.101

特集2は「Java 9集中講座」です.Web上の記事にも,目を通しました.

自分のところの大学の演習室環境のJavaも,そのうち,Java 9になるはずなので,この機会に少し,勉強しようと思いました.解説に書かれているコードの大部分は,一目で分かる内容ではありませんでしたが,Rubyirbに相当するものとして,jshellというコマンドが使用できるとのことで,mainを含むJavaのソースを書くことなく,ちょっとした式などを確かめるのに便利そうです.
Ubuntuで使えるようにするには…何日か前に,読んでブックマークしたのを,取り出しました.

では順に実施していきます.毎回sudoを書くのも面倒なので,最初にrootになっておきます.

$ sudo -i

以下,「# 」はrootによる実行のプロンプトを表します.まずはリポジトリ追加のコマンドです.

# add-apt-repository ppa:webupd8team/java

Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK7 / JDK8 / JDK9). There are no actual Java files in this PPA.

Important -> Why Oracle Java 7 And 6 Installers No Longer Work: http://www.webupd8.org/2017/06/why-oracle-java-7-and-6-installers-no.html

Ubuntu 16.10 Yakkety Yak is no longer supported by Canonical (and thus, Launchpad and this PPA). The PPA supports Ubuntu 17.10, 17.04, 16.04, 14.04 and 12.04.
(略)
Oracle Java 9 (for both Ubuntu and Debian): http://www.webupd8.org/2015/02/install-oracle-java-9-in-ubuntu-linux.html

Oracle JDK 9 is now considered stable. There are currently only 64bit builds (no other builds are available for download: http://www.oracle.com/technetwork/java/javase/downloads/index.html )
 詳しい情報: https://launchpad.net/~webupd8team/+archive/ubuntu/java
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます

JavaインストーラUbuntuのバージョンで古いものは使えないだとか,Oracle JDK 9が現時点で安定版だとかの情報を知り,指示されるままにEnterキーを押しました.

gpg: 鍵リング「/tmp/tmpb0m0cal9/secring.gpg」ができました
gpg: 鍵リング「/tmp/tmpb0m0cal9/pubring.gpg」ができました
gpg: 鍵EEA14886をhkpからサーバkeyserver.ubuntu.comに要求
gpg: /tmp/tmpb0m0cal9/trustdb.gpg: 信用データベースができました
gpg: 鍵EEA14886: 公開鍵"Launchpad VLC"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg:               インポート: 1  (RSA: 1)
OK

「鍵が見つかりません」はエラーかと思いきや,「究極的に信用する鍵」の表記,そしてgpg = GNU Privacy Guardなのに注意すると,これはPGP (Pretty Good Privacy)の信頼度設定に関する話です.エラーではなく,無事にインポートできました.
次はパッケージの一覧の更新です.

# apt update

ヒット:1 http://jp.archive.ubuntu.com/ubuntu xenial InRelease
(略)
取得:13 http://ppa.launchpad.net/webupd8team/java/ubuntu xenial/main amd64 Packages [2,912 B]
(以下略)

一つ前のadd-apt-repositoryコマンドで引数に書いた「webupd8team」も,アクセスしていることが分かります.
最後のメッセージに,アップグレード可能なものがあるよと出ていたので,アップグレードを行っておきます.

# apt upgrade

ではJavaのインストールです.はじめに,デフォルトのJRE (Java Runtime Environment)をインストールしておきます…

# apt install default-jre

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
default-jre はすでに最新バージョン (2:1.8-56ubuntu2) です。
default-jre は手動でインストールしたと設定されました。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

…が,インストール済みでした.
バージョンを確認しておきます.

# java -version

openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

ふむふむ.OpenJDK,なのですね.
ではJava 9をインストールしましょう.Oracle Java 9からでも良かったのですが,複数バージョンを入れられるということで,まずはOracle Java 8からにしました.

# apt install oracle-java8-installer

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  gsfonts-x11 oracle-java8-set-default
提案パッケージ:
  visualvm ttf-baekmuk | ttf-unfonts | ttf-unfonts-core ttf-kochi-gothic
  | ttf-sazanami-gothic ttf-kochi-mincho | ttf-sazanami-mincho
  ttf-arphic-uming
以下のパッケージが新たにインストールされます:
  gsfonts-x11 oracle-java8-installer oracle-java8-set-default
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
47.0 kB のアーカイブを取得する必要があります。
この操作後に追加で 237 kB のディスク容量が消費されます。
続行しますか? [Y/n]

提案パッケージは,sazanamiやkochiなどからすると,フォントですね(ttfはTrueType Fontですし).まあいいや.Enterキーを押して,「以下のパッケージが」の3つだけをインストールしました.
途中で,「パッケージの設定」というのが表示されました.まずはEnterを押し,「はい」「いいえ」が出たら「はい」に合わせてEnterを押しました.
Y/nを答える前のメッセージを読み直すと,「47.0 kB のアーカイブを取得する必要があります」とあります.ですがコンパイラなどが込みのJDKJava Development Kit)が,こんなサイズなわけがありません.
途中で,ダウンロードしていました.181MBです.

oracle-java8-installer (8u151-1~webupd8~0) を展開しています...
(略)
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 189736377 (181M) [application/x-gzip]
`jdk-8u151-linux-x64.tar.gz' に保存中
(略)
184320K ........ .......                                     100% *.*M=**s

2017-12-05 **:**:** (*.* MB/s) - `jdk-8u151-linux-x64.tar.gz' へ保存完了 [189736377/189736377]
(略)

待っていると,「# 」の,rootのプロンプトが出ました.
ここで再び,javaコマンドのバージョンを見ておきましょう.

# java -version

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

先ほどの同じコマンドの出力と比較すると,バージョン番号は「1.8.0_151」「25.151-b12」で同一ですが,今回,「OpenJDK」の文字がなくなっています.Oracle Java 8のインストールに成功したと思って,いいでしょう.
これまでインストールされたバージョンを,見ることにします.

# update-alternatives --config java

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

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

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

選択肢は0,1,2の3つあるように見えますが,0と2は同じなので,「2個の選択肢」は間違いではありません.
続きまして,Oracle Java 9のインストールです.

# apt install oracle-java9-installer

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  oracle-java9-set-default
提案パッケージ:
  visualvm ttf-baekmuk | ttf-unfonts | ttf-unfonts-core ttf-kochi-gothic
  | ttf-sazanami-gothic ttf-kochi-mincho | ttf-sazanami-mincho
  ttf-arphic-uming
以下のパッケージは「削除」されます:
  oracle-java8-set-default
以下のパッケージが新たにインストールされます:
  oracle-java9-installer oracle-java9-set-default
アップグレード: 0 個、新規インストール: 2 個、削除: 1 個、保留: 0 個。
35.2 kB のアーカイブを取得する必要があります。
この操作後に追加で 113 kB のディスク容量が消費されます。
続行しますか? [Y/n]

提案パッケージは先ほどと同じですが,続行すると,oracle-java8-set-defaultが削除されてしまいます.まあいいでしょう.Enterキーを押して,インストールしました.

取得:1 http://ppa.launchpad.net/webupd8team/java/ubuntu xenial/main amd64 oracle-java9-installer amd64 9.0.1-1~webupd8~0 [30.8 kB]
取得:2 http://ppa.launchpad.net/webupd8team/java/ubuntu xenial/main amd64 oracle-java9-set-default amd64 9.0.1-1~webupd8~0 [4,442 B]

パッケージの一つが30KBほど,もう一つが4メガバイト!? …いえ,4,442バイトでした.
またもjdkのtar.gzファイルをダウンロードしていきます.ファイルは名jdk-9.0.1_linux-x64_bin.tar.gzで,サイズは338MBでした.
jshellをはじめ,いろいろなコマンドが使えるようになりました.

update-alternatives: /usr/bin/jaotc (jaotc) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jaotc を使います
update-alternatives: /usr/bin/jdeprscan (jdeprscan) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jdeprscan を使います
update-alternatives: /usr/bin/jhsdb (jhsdb) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jhsdb を使います
update-alternatives: /usr/bin/jimage (jimage) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jimage を使います
update-alternatives: /usr/bin/jlink (jlink) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jlink を使います
update-alternatives: /usr/bin/jmod (jmod) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jmod を使います
update-alternatives: /usr/bin/jshell (jshell) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jshell を使います
update-alternatives: /usr/bin/jweblauncher (jweblauncher) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/jweblauncher を使います
update-alternatives: /usr/bin/javaws.real (javaws.real) を提供するために自動モードで /usr/lib/jvm/java-9-oracle/bin/javaws.real を使います
update-binfmts: warning: current package is oracle-java8, but binary format already installed by openjdk-7
Oracle JDK 9 installed
(略)
oracle-java9-set-default (9.0.1-1~webupd8~0) を設定しています ...
新バージョンの設定ファイル /etc/profile.d/jdk.csh をインストールしています ...
新バージョンの設定ファイル /etc/profile.d/jdk.sh をインストールしています ...

無事にOracle Java 9のインストールが完了しました.
再度,javaコマンドのバージョンとパスを見ていきましょう.

# 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)

# update-alternatives --config java

alternative java (/usr/bin/java を提供) には 3 個の選択肢があります。

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

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

一つ,増えています.
javcとjavawsも,見ておきます.

# update-alternatives --config javac

alternative javac (/usr/bin/javac を提供) には 3 個の選択肢があります。

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

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

# update-alternatives --config javaws

alternative javaws (/usr/bin/javaws を提供) には 2 個の選択肢があります。

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

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

Java 9が使えるようになって,まずは…そうでした,jshellコマンドでした.

# exit
$ jshell --help

12月 05, 2017 **:**:** 午後 java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
使用方法:   jshell <options> <load files>
使用可能なオプションには次のものがあります:
    --class-path <path>   ユーザー・クラス・ファイルのある場所を指定します
    --module-path <path>  アプリケーション・モジュールのある場所を指定します
    --add-modules <module>(,<module>)*
                          解決するモジュール、または<module>がALL-MODULE-PATH
                           である場合はモジュール・パスのすべてのモジュールを指 定します
    --startup <file>      起動定義の代替として実行されます
    --no-startup          起動定義を実行しません
    --feedback <mode>     初期フィードバック・モードを指定します。モードは
                           事前に定義されている(silent、concise、normalまたはverbose)か、
                           事前にユーザーが定義できます
    -q                    簡潔なフィードバック。--feedback conciseと同じ
    -s                    非常に簡潔なフィードバック。--feedback silentと同じ
    -v                    詳細なフィードバック。--feedback verboseと同じ
    -J<flag>              <flag>を実行時システムに直接渡します。
                            実行時フラグまたはフラグ引数ごとに1つの-Jを使用しま す
    -R<flag>              <flag>をリモート実行時システムに渡します。
                            リモート・フラグまたはフラグ引数ごとに1つの-Rを使用 します
    -C<flag>              <flag>をコンパイラに渡します。
                            コンパイラ・フラグまたはフラグ引数ごとに1つの-Cを使 用します
    --version             バージョン情報を出力し終了します
    --show-version        バージョン情報を出力し続行します
    --help                標準オプションのこの概要を出力し終了します
    --help-extra, -X      非標準オプションのヘルプを出力し終了します

ヘルプメッセージは日本語です.

$ jshell

|  JShellへようこそ -- バージョン9.0.1
|  概要については、次を入力してください: /help intro

jshell>

さて,何を試してみますか…

jshell> System.out.println("Hello, World")
Hello, World

うまくいきました.次は…日本語を試しましょう.

jshell> System.out.println("和歌山")
和歌山

日本語も出ました…と言いたいのですが,バイト列を受け取り,そのまま出力していて,ja_JP.UTF-8の端末なので「和歌山」と表示された,という可能性も考えられます.
バイト数か文字列長かは,Stringクラスのlengthメソッドで判断できるのではないかと思い,やってみました.

jshell> String s = "和歌山"
s ==> "和歌山"

jshell> s.length()
$4 ==> 3

ということで,バイト列ではなく,3文字からなる文字列として,扱われていました.
これからもっと,活用していきますか!