One IT Thing

IT業界を楽しむ為の学習系雑記

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で単発Web決済を一通り流してみる

会社仕事でも個人ビジネスでも、商品やサービスの対価として利用者に課金方法を提供したい時があるかと思います。 最もメジャーな決済方法であるクレジットカードで課金してもらう仕組みを導入したいところですが、 …

Tomcat9をCentOS7&OpenJDK11で起動

CentOS 7.6にOpenJDK 11を以下の記事で入れている状態です。 One IT ThingCentOS7にOpenJDK11をインストール、alternatives後の再ログイン …

JavaでRSA暗号を使う際にCRYPTREC暗号リストに足元をすくわれる可能性を回避する

標準的な暗号しか使わないケースでもJavaでRSAを使う時はBouncyCastleを入れておいた方が無難、という話です。 “ECB”という文字列がプログラム中にあると監査に引 …

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(1)

目次1 IPAmj明朝フォントとは2 日本における漢字のコンピュータ表示課題3 サロゲートペアが対応策だが4 IVS(ideographic variation sequence) とは5 そこでIP …

IVS、サロゲートペアが混じった文字列をJavaのWebアプリでワードカウントする

(結論:java.text.BreakIteratorは「サロゲートペア文字 + IVS」の8バイト文字も1文字としてカウントしてくれる) 先日、IPAmj明朝フォントを使ってIVSを含んだUnico …


shingo nakanishi。東京で消耗中の職歴20年越え中年ITエンジニアです。「生涯現役プログラマを楽しむ」ことができる働き方探しをライフワークにしています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。