OpenJDKはCentOS-Baseリポジトリのupdatesに登録されているので新規yumリポジトリ追加は不要です。
[root@spock tmp]# yumdb search from_repo updates | grep openjdk | grep 11
1:java-11-openjdk-11.0.3.7-0.el7_6.x86_64
1:java-11-openjdk-devel-11.0.3.7-0.el7_6.x86_64
1:java-11-openjdk-headless-11.0.3.7-0.el7_6.x86_64
環境
CentOS 7.6
[root@spock ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
openjdk11インストール
yum install java-11-openjdk-devel。
[root@spock ~]$ yum install java-11-openjdk-devel
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 7.4 kB 00:00:00
* base: ftp.iij.ad.jp
* epel: mirror.horizon.vn
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
epel | 5.3 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/2): epel/x86_64/updateinfo | 994 kB 00:00:00
(2/2): epel/x86_64/primary_db | 6.8 MB 00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ java-11-openjdk-devel.x86_64 1:11.0.3.7-0.el7_6 を インストール
--> 依存性の処理をしています: java-11-openjdk(x86-64) = 1:11.0.3.7-0.el7_6 のパッケージ: 1:java-11-openjdk-devel-11.0.3.7-0.el7_6.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ java-11-openjdk.x86_64 1:11.0.3.7-0.el7_6 を インストール
--> 依存性の処理をしています: java-11-openjdk-headless(x86-64) = 1:11.0.3.7-0.el7_6 のパッケージ: 1:java-11-openjdk-11.0.3.7-0.el7_6.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ java-11-openjdk-headless.x86_64 1:11.0.3.7-0.el7_6 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
============================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
============================================================================================================================================
インストール中:
java-11-openjdk-devel x86_64 1:11.0.3.7-0.el7_6 updates 3.3 M
依存性関連でのインストールをします:
java-11-openjdk x86_64 1:11.0.3.7-0.el7_6 updates 194 k
java-11-openjdk-headless x86_64 1:11.0.3.7-0.el7_6 updates 38 M
トランザクションの要約
============================================================================================================================================
インストール 1 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 42 M
インストール容量: 165 M
Is this ok [y/d/N]: Y
Downloading packages:
(1/3): java-11-openjdk-11.0.3.7-0.el7_6.x86_64.rpm | 194 kB 00:00:00
(2/3): java-11-openjdk-devel-11.0.3.7-0.el7_6.x86_64.rpm | 3.3 MB 00:00:00
(3/3): java-11-openjdk-headless-11.0.3.7-0.el7_6.x86_64.rpm | 38 MB 00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------
合計 45 MB/s | 42 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : 1:java-11-openjdk-headless-11.0.3.7-0.el7_6.x86_64 1/3
インストール中 : 1:java-11-openjdk-11.0.3.7-0.el7_6.x86_64 2/3
インストール中 : 1:java-11-openjdk-devel-11.0.3.7-0.el7_6.x86_64 3/3
検証中 : 1:java-11-openjdk-devel-11.0.3.7-0.el7_6.x86_64 1/3
検証中 : 1:java-11-openjdk-11.0.3.7-0.el7_6.x86_64 2/3
検証中 : 1:java-11-openjdk-headless-11.0.3.7-0.el7_6.x86_64 3/3
インストール:
java-11-openjdk-devel.x86_64 1:11.0.3.7-0.el7_6
依存性関連をインストールしました:
java-11-openjdk.x86_64 1:11.0.3.7-0.el7_6 java-11-openjdk-headless.x86_64 1:11.0.3.7-0.el7_6
完了しました!
JDKバージョン切り替え
CentOS7はデフォルトでOpenJDK8がインストールされている為、alternativesコマンドで11に切り替えます。シンボリックリンクの/bin/java他が変更されたJDKのjavaコマンドを参照するようになります。
[root@spock ~]# alternatives --config java
2 プログラムがあり 'java' を提供します。
選択 コマンド
-----------------------------------------------
*+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre/bin/java)
2 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64/bin/java)
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
JAVA_HOME環境変数を設定
TomcatやOpenGrokなど$JAVA_HOMEが設定されていることを期待しているミドルの為に設定。
alternativesコマンドでJDKルートが変わってしまうので動的に設定されるようにします。alternativesは/bin/javaをシンボリックリンクとして置き換えるのでreadlinkコマンドを使ってリンク元を割り出します。
再帰的にリンクが貼られているのでヒットするまでreadlinkを繰り返し。
[root@spock ~]# which java
/bin/java
[root@spock ~]# readlink $(which java)
/etc/alternatives/java
[root@spock ~]# readlink $(readlink $(which java))
/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64/bin/java
[root@spock ~]# dirname $(readlink $(readlink $(which java)))
/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64/bin
[root@spock ~]# dirname $(dirname $(readlink $(readlink $(which java))))
/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64
binが見つかったら最後にdirnameコマンドでbinの親ディレクトリを特定します。JDKのホームディレクトリがコマンドから割り出せるようになりました。
readlinkは-eで再帰出来るので最後のコマンドは以下と同義になり、ちょっとだけ短くできます。
[root@spock ~]# dirname $(dirname $(readlink -e $(which java)))
/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64
全ユーザログイン時にJAVA_HOME環境変数を適用させる。alternativesが/binにリンクを張ってくれるけど一応binをPATHに追加。
vi /etc/profile.d/java.sh
# 以下の内容を記述して保存
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))
export PATH=${PATH}:${JAVA_HOME}/bin
ログインし直すか、source /etc/profile.d/java.shを実行して$JAVA_HOMEを読み込みます。
動作確認
[root@spock tmp]# vi HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println(System.getProperty("java.version"));
}
}
[root@spock tmp]# javac HelloWorld.java
[root@spock tmp]# ls
HelloWorld.class HelloWorld.java
[root@spock tmp]# java HelloWorld
Hello World!
11.0.3
留意点
alternatives直後、javaのバージョンは切り替わりますがJAVA_HOME切り替えは要ログイン。