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

1前書き

このチュートリアルでは、設定ミス時にMavenがスローする例外について説明します。 JAVA HOMEはJREではなくJDKを指す必要があります。

Maven はコードを構築するための強力なツールです。フードの下を見て、なぜこのエラーが発生するのかを理解し、それを解決する方法を見ます。

2 JAVA HOME__の問題

Mavenをインストールした後、 JAVA HOME__環境変数を設定する必要があるので、ツールは実行するJDKコマンドがどこにあるかを知っています。 Mavenの目標は、プロジェクトのソースコードに対して適切なJavaコマンドを実行することです。

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

  • JAVA HOME__が有効なJDKインストール** を指していない場合、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__パスを検証しますか?

目標を実行する前に、** Mavenは JAVA HOME で指定されたパスに java__コマンドがあるかどうか、またはOSにデフォルトのJDKインストールを要求することによって確認します。実行ファイルが見つからない場合、Mavenはエラーで終了します。

これはLinux用の mvn 実行可能ファイルのチェックです(Apache Maven v3.5.4)。

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

このチェックは一見すると合理的に思えるかもしれませんが、JDKとJREの両方に bin フォルダーがあり、両方に実行可能な java ファイルが含まれていることを考慮する必要があります。

そのため、JREインストールを指すように JAVA HOME__を設定し、この特定のエラーを隠し、後の段階で問題を引き起こすことが可能です。 その他の重要な相違点

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

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

デフォルト設定ではいつものように、それらが「標準」設定の場合はとても便利です。

たとえば、Ubuntu 18.04システムにJava 11をインストールし、 JAVA HOME__環境変数を設定していない場合でも、Mavenはコンパイルを含むさまざまな目的でJDKを見つけて使用します。

しかし、私たちのシステムに非標準の設定を(なんとか混乱させただけで)設定できたなら、Mavenの有用性はもはや十分ではありません。

誤解を招く可能性もあります。

Ubuntu 18.04に次の設定があるとします。

  • JDK 11

  • JRE 8

  • JAVA HOME__はJRE 8インストールのパスに設定します。

基本的な確認をすると

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__変数の値をJREではなくJDKを指すように変更します。

ただし、何らかの理由でデフォルトを設定できない場合でも、プロジェクトレベルで設定を上書きできます。 その方法を見てみましょう。

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

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
</plugin>

次に、カスタム実行可能ファイルを使用するように設定を追加し、 JAVA HOME/bin ディレクトリで javac__を検索しないようにします。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <fork>true</fork>
        <executable>/usr/lib/jvm/java-11-openjdk-amd64/bin/javac</executable>
    </configuration>
</plugin>

Unixシステムでは、この実行可能ファイルは適切な許可を持つスクリプトであるべきです。 Windowsシステムでは、 .exe ファイルになります。

次に、プロジェクトをもう一度コンパイルします。

mvn clean compile

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

4 JAVA HOME__設定を確認する

JAVA HOME__が実際の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の検索ユーティリティを使用してパスを見つけることができるはずです ** ディストリビューションが携帯用のものだった場合は、フォルダを確認しましょう。

抽出しました

  • JDKへのパスがわかれば、https://www.baeldung.com/java-home-on-windows-7-8-10-mac-os-x-を使用して JAVA HOME__環境変数を設定できます** 。 linux[私たちの特定のOSにふさわしい結果]。

6. 結論

この簡単なチュートリアルでは、「 __JAVA HOMEはJREではなくJDKを指すべきです」____Mavenエラーについて説明し、その根本原因を調べました。

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