お金をかけずにサーバーの勉強をしよう

Java SE Development Kit (JDK) インストール

2022年9月26日

メニューへ戻る

Ubuntu 22.04.1(Serverを使っていますが Desktopでも同じです)に Java SDK(Java StandardEdition Development Kit)をインストールします。

最近ではこれだけで開発するということはほぼ無いと思いますので、Javaの統合開発環境を実行するためのインフラを整えるという意味合いになると思います。

Javaはサンマイクロシステムズが開発したプログラミング言語ですが、サンマイクロシステムズが Oracleに買われてしまったため、現在は Oracleのプロダクトとなっています。

本家の Oracleは Java8の途中から無償サポートを打ち切ってしまった(お金を払った人にだけパッチをあげる)ため当時は Java界隈が騒然としたのですが、どうやら Java17から無償サポートを再開したようです。

Javaの仕様は公開されており、これに従って作られたものは基本的にどれも同じ動作をするものと考えてよく、Linuxの世界では OpenJDKもよく使われていますし、AWSは Correttoを Azureは Zuluという独自開発の Javaをリリースしています。

どれを選ぶかは、お仕事で使うのかお勉強なのかで変わってくると思いますが、再び無償サポートもされるようになったので本家である Oracleのものを使ってみようと思います。

Oracleの Javaダウンロードサイトは以下です。

Java Downloads

このような画面になってますので、Ubuntuなら [x64 Debian Package] を選択します。
Java 01

2022年9月26日現在は、19の 2022-09-20が最新でした。
19(2022年9月20日に出たばっか)は 17の次の LTS(Long Term Support)版ですので、Java8以降の新しい Javaはしばらくこれが主流になっていくんでしょうね。

ダウンロードがが完了すると、jdk-19_linux-x64_bin.deb というファイルができました。

debパッケージファイルのインストール、これまでは aptコマンドでやってましたが、インストールの最後に

N: ファイル '/home/subro/jdk-19_linux-x64_bin.deb' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: 許可がありません)

と出るのが嫌なので、ここでは debパッケージインストール用の gdebi(Simple tool to install deb files)コマンドを使ってみます。

gdebiコマンドは Ubuntu Server 22.04.1にはデフォルトではインストールされていなかったので、dgebi-coreパッケージをインストールします。

subro@UbuntuServer2204:~$ sudo apt install -y gdebi-core
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了

〜〜〜 中略 〜〜〜

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
インストールできました。

では Java19をインストールします。

subro@UbuntuServer2204:~$ ls -l jdk-19_linux-x64_bin.deb
-rw-rw-r-- 1 subro subro 162099250  9月 26 09:14 jdk-19_linux-x64_bin.deb

subro@UbuntuServer2204:~$ sudo gdebi --n jdk-19_linux-x64_bin.deb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Reading state information... Done
0% [jp.archive.ubuntu.com へ接続しています]                                                                                                                                                         0% [jp.archive.ubuntu.com (160.26.2.185) へ接続しています]                                                                                                                                          0% [ヘッダの待機中です]                                                                                                                                                                             Get:1 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 alsa-topology-conf all 1.2.5.1-2 [15.5 kB]
0% [ヘッダの待機中です]                                                                                                                                                                             Get:2 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 libasound2-data all 1.2.6.1-1ubuntu1 [19.1 kB]
0% [ヘッダの待機中です]                                                                                                                                                                             Get:3 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 libasound2 amd64 1.2.6.1-1ubuntu1 [390 kB]
6% [ヘッダの待機中です]                                                                                                                                                                             Get:4 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 alsa-ucm-conf all 1.2.6.3-1ubuntu1 [41.0 kB]
7% [ヘッダの待機中です]                                                                                                                                                                             Get:5 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libc6-i386 amd64 2.35-0ubuntu3.1 [2837 kB]
51% [ヘッダの待機中です]                                                                                                                                                                            Get:6 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libc6-x32 amd64 2.35-0ubuntu3.1 [2978 kB]
98% [ヘッダの待機中です]                                                                                                                                                                            Get:7 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 libxi6 amd64 2:1.8-1build1 [32.6 kB]
99% [ヘッダの待機中です]                                                                                                                                                                            Get:8 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 libxrender1 amd64 1:0.9.10-1build4 [19.7 kB]
Get:9 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 x11-common all 1:7.7+23ubuntu2 [23.4 kB]
Get:10 http://jp.archive.ubuntu.com/ubuntu jammy/main amd64 libxtst6 amd64 2:1.2.3-1build4 [13.4 kB]
Fetched 6369 kB in 0s (0 B/s)
以前に未選択のパッケージ alsa-topology-conf を選択しています。
(データベースを読み込んでいます ... 現在 109541 個のファイルとディレクトリがインストールされています。)
.../0-alsa-topology-conf_1.2.5.1-2_all.deb を展開する準備をしています ...
alsa-topology-conf (1.2.5.1-2) を展開しています...
以前に未選択のパッケージ libasound2-data を選択しています。
.../1-libasound2-data_1.2.6.1-1ubuntu1_all.deb を展開する準備をしています ...
libasound2-data (1.2.6.1-1ubuntu1) を展開しています...
以前に未選択のパッケージ libasound2:amd64 を選択しています。
.../2-libasound2_1.2.6.1-1ubuntu1_amd64.deb を展開する準備をしています ...
libasound2:amd64 (1.2.6.1-1ubuntu1) を展開しています...
以前に未選択のパッケージ alsa-ucm-conf を選択しています。
.../3-alsa-ucm-conf_1.2.6.3-1ubuntu1_all.deb を展開する準備をしています ...
alsa-ucm-conf (1.2.6.3-1ubuntu1) を展開しています...
以前に未選択のパッケージ libc6-i386 を選択しています。
.../4-libc6-i386_2.35-0ubuntu3.1_amd64.deb を展開する準備をしています ...
libc6-i386 (2.35-0ubuntu3.1) を展開しています...
以前に未選択のパッケージ libc6-x32 を選択しています。
.../5-libc6-x32_2.35-0ubuntu3.1_amd64.deb を展開する準備をしています ...
libc6-x32 (2.35-0ubuntu3.1) を展開しています...
以前に未選択のパッケージ libxi6:amd64 を選択しています。
.../6-libxi6_2%3a1.8-1build1_amd64.deb を展開する準備をしています ...
libxi6:amd64 (2:1.8-1build1) を展開しています...
以前に未選択のパッケージ libxrender1:amd64 を選択しています。
.../7-libxrender1_1%3a0.9.10-1build4_amd64.deb を展開する準備をしています ...
libxrender1:amd64 (1:0.9.10-1build4) を展開しています...
以前に未選択のパッケージ x11-common を選択しています。
.../8-x11-common_1%3a7.7+23ubuntu2_all.deb を展開する準備をしています ...
x11-common (1:7.7+23ubuntu2) を展開しています...
以前に未選択のパッケージ libxtst6:amd64 を選択しています。
.../9-libxtst6_2%3a1.2.3-1build4_amd64.deb を展開する準備をしています ...
libxtst6:amd64 (2:1.2.3-1build4) を展開しています...
libxi6:amd64 (2:1.8-1build1) を設定しています ...
libxrender1:amd64 (1:0.9.10-1build4) を設定しています ...
x11-common (1:7.7+23ubuntu2) を設定しています ...
libc6-x32 (2.35-0ubuntu3.1) を設定しています ...
libasound2-data (1.2.6.1-1ubuntu1) を設定しています ...
alsa-topology-conf (1.2.5.1-2) を設定しています ...
libasound2:amd64 (1.2.6.1-1ubuntu1) を設定しています ...
libc6-i386 (2.35-0ubuntu3.1) を設定しています ...
alsa-ucm-conf (1.2.6.3-1ubuntu1) を設定しています ...
libxtst6:amd64 (2:1.2.3-1build4) を設定しています ...
man-db (2.10.2-1) のトリガを処理しています ...
libc-bin (2.35-0ubuntu3.1) のトリガを処理しています ...
Scanning processes...
Scanning linux images...

Running kernel seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
以前に未選択のパッケージ jdk-19 を選択しています。
(データベースを読み込んでいます ... 現在 110680 個のファイルとディレクトリがインストールされています。)
jdk-19_linux-x64_bin.deb を展開する準備をしています ...
jdk-19 (19-ga) を展開しています...
jdk-19 (19-ga) を設定しています ...

インストールは済んだのですが…

subro@UbuntuServer2204:~$ which java

subro@UbuntuServer2204:~$

javaコマンドがパスの通っている所にありません。

どこにあるかというと、ここ。

subro@UbuntuServer2204:~$ ls -l /usr/lib/jvm/jdk-19/bin/java
-rwxr-xr-x 1 10668 10668 12328  8月 13 05:52 /usr/lib/jvm/jdk-19/bin/java

何やら変な所にインストールされています。

これは複数バージョンのアプリケーションを切り替えて使えるようにする Ubuntuの alternativeシステムに沿うようにしているのかも知れません。

OpenJDKは alternativeに対応して、/bin/javaで実行できるようにしてくれるのですが、Oracle謹製のはそこまでしてくれないようです。

以下のコマンドを実行することで /usr/bin以下にシンボリックリンクを作ってくれます。

subro@UbuntuServer2204:~$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk-19/bin/java" 1
update-alternatives: /usr/bin/java (java) を提供するために自動モードで /usr/lib/jvm/jdk-19/bin/java を使います

subro@UbuntuServer2204:~$ java --version
java 19 2022-09-20
Java(TM) SE Runtime Environment (build 19+36-2238)
Java HotSpot(TM) 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)

但し Javaのコマンドは javaコマンド以外にも結構な数があり、全てのコマンドに対してこれを行うのは結構面倒です。

Javaの全コマンドに対して update-alternatives --install をするシェルスクリプトを作っている人もいますが、統合開発環境を利用する場合はそのソフト上で複数の Java SDKを直接指定することができるようになっていると思います。

また環境変数の「JAVA_HOME」はこの方法では自動で切り替えられないようですので、結局のところ Javaのどの様な使い方をしても一撃で済ませる方法は無いように思います。

幾つものバージョンを切り替えながら開発をする本気のプログラマであれば必要かも知れませんが、そうでなければ /usr/lib/jvm/jdk-19/binを PATH環境変数に追加してしまって良いのではないかと思います。

私は上記にシンボリックリンクに加え、/etc/environment ファイルに

JAVA_HOME=/usr/lib/jvm/jdk-19

と加えて、システム環境変数とする(全ユーザーに反映する)ことで逃げてしまいました。

今後 Javaを使うソフトを使う際にこのあたりの環境設定を個々に考えるのが良いのではないでしょうか。



この本も長いですね〜。