java

CentOS7にOpenJDK11をインストール、alternatives後の再ログインでJAVA_HOMEも自動変更

投稿日:2019年7月23日

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切り替えは要ログイン。

-java
-,

執筆者:

関連記事

Stripe+Java+Payment Request APIでApple Pay、Google Payを使ったテストWeb決済をしてみる

自分で作ったサービスを運用してチャリンチャリンしたい・・・エンジニアならこんな夢、一度は見たことがあるんじゃないでしょうか。 夢を実現する為、以前Stripeのcheckout.jsを使ったテストWe …

Doxygenでspring-frameworkをドキュメント化

以前にspring-frameworkのソースリーディングが出来る環境をOpenGrokで作りました。One IT ThingOpenGrokをインストールしてソースリーディング環境を作るhttps: …

JavaとPerlでUDPソケット通信

目次1 はじめに2 対象読者3 実装3.1 UDPサーバ(Perl)3.2 UDPクライアント(Java)3.3 実行4 まとめ はじめに 本棚を整理していたらラクダ本が出てきました。うわー懐かしい、 …

Stripe + Javaでオーソリ(与信の確保)を実装する

Stripeでチャリンチャリン、サービスを開発するエンジニアにとっては夢がありますよね。 例え自分で個人的に売るものが無かったとしても、Web決済システムを構築できるノウハウを持っておけば、公的な仕事 …

JUnitコードの自動生成も出来る古の神Eclipseプラグイン「CodeProAnalytix」は今でも使える

デスマーチPM「各社のPG進捗が遅れていてユニットテストを書く暇が全く無いんですよ、なにかいい手は有りませんかね・・・? 因みに本プロジェクトはカバレッジ100%で請け負っています!(キリッ)」 何故 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。