要約がわりのコマンド一覧:
- 作者: 森本利博,武井優己,SPY,久保田祐史,大倉香織,石川雅之,袴田類,山下和彦,牧大輔,穴井宏幸,加藤隆一郎,加藤佑典,金昌熙,佐藤健太,のざきひろふみ,うらがみ,久田真寛,ひげぽん,池田拓司,はまちや2,竹原,牟田裕太郎,粕谷大輔,陶山嶺,長谷川智希,石田和太郎,小林純一,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2017/10/24
- メディア: 大型本
- この商品を含むブログを見る
特集2は「Java 9集中講座」です.Web上の記事にも,目を通しました.
- Java 9のリリースとこれまでのトレンドを振り返る (1/3):CodeZine(コードジン)
- 2017年9月22日 Java 9が正式リリース,「Project Jigsaw」をようやく実装:Linux Daily Topics|gihyo.jp … 技術評論社
- Java9の新機能とサンプルコード - Qiita
自分のところの大学の演習室環境のJavaも,そのうち,Java 9になるはずなので,この機会に少し,勉強しようと思いました.解説に書かれているコードの大部分は,一目で分かる内容ではありませんでしたが,Rubyのirbに相当するものとして,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 のアーカイブを取得する必要があります」とあります.ですがコンパイラなどが込みのJDK(Java 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文字からなる文字列として,扱われていました.
これからもっと,活用していきますか!