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(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

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

したがって、JREインストールを指すようにJAVA_HOMEを構成して、この特定のエラーを非表示にし、後の段階で問題を引き起こす可能性があります。 JREの主な目的はJavaコードを実行することですが、 JDKは、他の重要な違いの中でも、をコンパイルおよびデバッグすることもできます。

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

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を指すようにします。 JREの。

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

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

<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へのパスがわかれば、特定のOS に適切な結果を使用して、JAVA_HOME環境変数を設定できます。

6. 結論

この簡単なチュートリアルでは、「 JAVA_HOMEはJREではなくJDKを指す必要があります」Mavenエラーについて説明し、その根本的な原因を調べました。

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