1. 概要

OpenJDKとOracleJDKは、業界で広く使用されている2つのJava環境です。 どちらもパフォーマンスが高く、安定しています。 ただし、の違いがいくつかあります。

したがって、「このマシンで実行されているJDKはどれですか?」という質問に対する答えをすばやく取得したい場合があります。

このチュートリアルでは、現在のJava環境がOracleJDKまたはOpenJDKであるかどうかを確認する方法について説明します。

2. 問題の紹介

ご存知のとおり、コマンド「 java -version 」は、詳細なJavaバージョン情報を出力します。 したがって、たとえば、OracleJDKがインストールされているマシンで実行すると次のようになります。

$ java -version
java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)

OpenJDKも同じコマンドをサポートしています:

$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)

もちろん、他のJDK実装もあります。 ソリューションを拡張して、他のJDKベンダーに適応させることができます。 ただし、簡単にするために、このチュートリアルでは、現在のJDKがOpenJDKであるかどうかのみを確認します。

次に、LinuxコマンドラインでJDKプロバイダー情報をすばやく取得する方法を見てみましょう。

3. 標準出力と標準エラー

java-version」の2つの出力が表示されるとすぐに、[X93X]java-versionの出力にgrep「OpenJDK」というアイデアが浮かび上がる可能性があります。[ X151X]

アイデアは簡単です。 OpenJDKで簡単なテストをしてみましょう:

$ java -version | grep -c 'OpenJDK'
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)
0

上記のコマンドでわかるように、オプション -c (一致する行の数のみを出力)をgrepコマンドに渡しました。 ただし、出力には元の「java-version」出力が含まれています。

さらに、出力の最後にある「 0 」は、パターン「OpenJDK」に一致する行が見つからないことを意味します。 これは明らかに真実ではありません。 なぜそれが起こっているのですか?

これは、コマンドjava -versionが、バージョン情報を標準出力(stdout)ではなく標準エラー(stderr)に書き込むためです。 ただし、次のパイプ( | )は、 java コマンドのstdoutのみを読み取り、grepコマンドをstdinとしてフィードします。

したがって、アイデアを機能させるには、javaコマンドのstderrをstdoutにリダイレクトする必要があります。

$ java -version 2>&1 | grep -c 'OpenJDK' 
2

今回は、上記の出力が示すように、期待される結果が得られました:2。

次に、 if ステートメントを記述して、出力が0より大きいかどうかを確認し、現在のJDKがOpenJDKであるかどうかを判断できます。

ただし、このチェックを行うためのより簡単なアプローチを見てみましょう。

4. grepコマンドを-qオプションとともに使用する

私たちが通過するとき -q オプション grep 指図、 grepは何も出力しません。 ただし、指定されたパターンが一致しない場合、grepコマンドはコード1で終了します。 それ以外の場合は、終了コード0で戻ります。

$ echo "Kotlin is amazing!" | grep -q 'Java'
$ echo $?
1

$ echo "Java is amazing!" | grep -q 'Java'
$ echo $?
0

終了コードを利用し、以下を使用して複数のコマンドを条件付きで連結できます。 &&と|| オペレーター

簡単な例で演算子を理解しましょう。

CMD1 && CMD2 || CMD3

上記の例では、CMD1が最初に実行されます。 成功した場合(終了コード= 0)にのみ、CMD2が開始されます。 それ以外の場合は、CMD3が実行されます。

したがって、JDKプロバイダーがOpenJDKであるかどうかを確認するコマンドを作成できます。

java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is NOT OpenJDK."

それでは、さまざまなJava環境でソリューションをテストし、期待どおりに機能するかどうかを確認しましょう。 まず、OpenJDKインストールに対して実行してみましょう。

$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+3)
OpenJDK 64-Bit Server VM (build 17.0.3+3, mixed mode)
$ java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is NOT OpenJDK."
It is OpenJDK.

ご覧のとおり、OpenJDKを正しく検出します。 次に、OracleJDKでテストしてみましょう。

$ java -version
java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)

$ java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is not OpenJDK."
It is not OpenJDK.

出力は、コマンドがこの場合にも機能することを示しています。

このコマンドを頻繁に使用する場合、longコマンドを入力するのは便利ではありません。 .bashrcファイルにaliasを作成できます。

alias chkJDK='java -version 2>&1 | grep -q "OpenJDK" && echo "It is OpenJDK." || echo "It is not OpenJDK."'

このように、現在のJDKのプロバイダーを確認する場合は、chkJDKエイリアスを起動するだけです。

5. 結論

この記事では、例を通じて、現在のJDKがOpenJDKであるかOracleJDKであるかを確認する方法を学びました。

私たちはその組み合わせに取り組んできました grep -q そしてその && || オペレーターは、この種の問題を簡単に解決できる場合があります。