JAVA__HOMEはJREではなくJDKを指すべきです

JAVA_HOMEは、JREではなくJDKを指す必要があります

1. 前書き

このチュートリアルでは、Mavenが誤って構成されたときにスローする例外について説明します:JAVA_HOME should point to a JDK, not a JRE.

Mavenは、コードを構築するための強力なツールです。 このエラーが発生する理由を理解するために内部を調べ、その解決方法を確認します。

2. JAVA_HOMEの問題

Mavenをインストールした後、we have to set the JAVA_HOME environment variable, so the tool knows where to find the JDK commandsを実行します。 Mavenの目標は、プロジェクトのソースコードに対して適切なJavaコマンドを実行します。

たとえば、最も一般的なシナリオは、javacコマンドを実行してコードをコンパイルすることです。

JAVA_HOME is not pointing to a valid JDK installationの場合、Mavenは実行のたびにエラーをスローします。

mvn -version

# Output... 
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK, not a JRE

3. JDKまたはJRE

MavenはJAVA_HOMEパスをどのように検証しますか?

目標を実行する前に、JAVA_HOMEで指定されたパスのMaven checks for the existence of the java commandを実行するか、OSにデフォルトのJDKインストールを要求します。 If the executable is not found, Maven terminates with the error.

Linux(Apache Maven v3.5.4)のmvn実行可能チェックは次のとおりです。

if [ -z "$JAVA_HOME" ] ; then
    JAVACMD=`which java`
else
    JAVACMD="$JAVA_HOME/bin/java"
fi
 
if [ ! -x "$JAVACMD" ] ; then
    echo "The JAVA_HOME environment variable is not defined correctly" >&2
    echo "This environment variable is needed to run this program" >&2
    echo "NB: JAVA_HOME should point to a JDK not a JRE" >&2
    exit 1
fi

このチェックは一見合理的に見えるかもしれませんが、both JDK and JRE have a bin folder and both contain an executable java file.を考慮する必要があります

したがって、それはpossible to configure JAVA_HOME to point to a JRE installation, hiding this particular error and causing problems at a later stage.です。JREの主な目的はJavaコードを実行することですが、the JDK can also compile and debug among other important differencesです。

このため、次のサブセクションで説明するように、mvn compileコマンドは失敗します。

3.1. JDKではなくJREが原因でコンパイルが失敗する

デフォルト設定ではいつものように、「標準」構成がある場合に非常に役立ちます。

たとえば、Ubuntu18.04システムにJava11をインストールし、JAVA_HOME環境変数を設定しない場合でも、MavenはJDKを問題なく見つけて、コンパイルなどのさまざまな目的に使用します。

しかし、システムに非標準の構成を設定できた場合(ましてや混乱した場合)、Mavenの有用性はもはや十分ではありません。 誤解を招く可能性もあります。

Ubuntu18.04で次の構成があると仮定します。

  • JDK 11

  • JRE 8

  • JAVA_HOMEがJRE8インストールのパスに設定されます

基本的なチェックを行う場合:

mvn --version

次のような意味のある出力が得られます。

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /opt/apache-maven-3.6.0
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-42-generic", arch: "amd64", family: "unix"

プロジェクトをコンパイルしようとするとどうなるか見てみましょう。

mvn clean compile

ここで、エラーが発生します。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project my-app: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

3.2. プロジェクトレベルでのコンパイルエラーの修正

Mavenの他の多くの場合と同様に、意味のあるシステム全体の設定をセットアップすることをお勧めします。この場合、セクション5で説明するように、JAVA_HOME変数の値を変更して、JDKではなくJDKを指すようにします。 JRE。

ただし、なんらかの理由でデフォルトを設定できない場合は、we can still override the settings on the project level. その方法を見てみましょう。

まず、プロジェクトのpom.xmlを開き、セクションbuild / pluginManagement / pluginsに移動して、maven-compiler-pluginのエントリを確認します。


    maven-compiler-plugin
    3.7.0

次に、カスタム実行可能ファイルを使用し、JAVA_HOME/binディレクトリでjavacの検索をスキップするように構成を追加します。


    maven-compiler-plugin
    3.7.0
    
        true
        /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
    

Unixシステムでは、この実行可能ファイルは適切な許可を持つスクリプトでなければなりません。 Windowsシステムでは、.exeファイルである必要があります。

次に、プロジェクトのコンパイルを再試行します。

mvn clean compile

これで、ビルド(maven-compiler-pluginを使用したコンパイルフェーズを含む)が成功しました。

4. JAVA_HOME構成の確認

check if JAVA_HOME points to an actual JDK. は非常に簡単です。そのコンテンツを端末に出力するか、次のシェルコマンドのいずれかを実行できます。

4.1. LinuxでJAVA_HOMEをチェックする

ターミナルを開いて入力するだけです:

> $JAVA_HOME/bin/javac -version

JAVA_HOMEがJDKを指している場合、出力は次のようになります。

> javac 1.X.0_XX

JAVA_HOMEがJDKを指していない場合、OSは次のエラーメッセージをスローします。

> bash: /bin/javac: No such file or directory

4.2. WindowsでJAVA_HOMEをチェックする

コマンドプロンプトを開き、次のように入力します。

%JAVA_HOME%\bin\javac -version

JAVA_HOMEがJDKを指している場合、出力は次のようになります。

> javac 1.X.0_XX

JAVA_HOMEがJDKを指していない場合、OSは次のエラーメッセージをスローします。

> The system cannot find the path specified.

5. 問題を解決する方法

まず、JDKの場所を知る必要があります。

  • パッケージインストーラーを使用してJDKディストリビューションをインストールした場合、OS検索ユーティリティを使用してパスを見つけることができるはずです。

  • ディストリビューションがポータブルなものである場合は、それを抽出したフォルダーを確認しましょう

Once we know the path to the JDK, we can set our JAVA_HOME environment variablethe appropriate results for our particular OSを使用。

6. 結論

この簡単なチュートリアルでは、「JAVA_HOME should point to a JDK not a JRE” Mavenエラー」について説明し、その根本的な原因を調べました。

最後に、JAVA_HOME環境変数をチェックする方法と、それがJDKを指していることを確認する方法について説明しました。