Maven JARプラグイン(バージョン3.0.2)は、jar
ゴールを1回呼び出しても、次のエラーをスローし続けます:
[エラー]プロジェクトテストで目標org.Apache.maven.plugins:maven-jar-plugin:3.0.2:jar(デフォルト)の実行に失敗しました:補助アーティファクトを置き換えるのではなく、分類子を使用してプロジェクトにアタッチする必要があります。 -> [ヘルプ1]
問題を示す(最小限の)pom.xml
を次に示します。
<project xmlns="http://maven.Apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
呼び出しはmvn package
です。
jar
およびtest-jar
)が指定されている場合にも発生します。jar
とtest-jar
の両方が本当に必要なので、これはオプションではありません。ドキュメント によると、classifier
は同じ目標の複数の呼び出しでのみ指定する必要があり、test-jar
目標には妥当なデフォルトがありますが、これは意図していません変化する。
また、この問題は、JARプラグインの2.x行には表示されないようです。
私は何か見落としてますか?誰かが私が間違っていることを提案してもらえますか?
追伸Mavenバージョンは3.3.9です。
Jarプラグインは、実際には構成で2回実行されています。
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
このような構成でログを確認すると、次のようなものが得られます。
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test ---
[INFO] Building jar: ...\test\target\test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default) @ test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
プラグインが実際に2回実行されたことを意味します。何が起こるかというと、jar
のパッケージを含むプロジェクトのJarプラグインには、package
phase にバインドされたデフォルトの実行があります。このデフォルトの実行は、IDがdefault-jar
のログに記載されているものです。
プラグインで<execution>
を構成したとき、プラグインのjar
ゴールが呼び出される新しい実行を実際に構成しました。 jar
ゴールはデフォルトでpackage
phase にバインドされるため、その実行はjar
パッケージに固有のデフォルトバインディングの後、そのフェーズで実行されます。また、プラグインは既に実行されているため、再度実行すると実際に最初の実行中に既に生成されたメインアーティファクトが置き換えられるため、失敗します。このエラーは、プラグインのバージョン3.0.0で MJAR-198 に追加されました。これは、こうした事態が発生する可能性が高いため、早期に検出する必要があるためです。
そのため、修正は簡単です。目標jar
を指定する実行を行わず、デフォルトの目標(jar
パッケージングに由来する)に作業を任せます。デフォルトの実行のおかげで、jar
ゴールを明示的に設定しなくても、JARは作成されます。テストJARも必要な場合 、プラグインを構成して、それを行う必要があります :
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
ただし、目標jar
が指定されていないことに注意してください。
ログに次のように表示される場合:
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test --
[WARNING] JAR will be empty - no content was marked for inclusion!
Src/main/Javaに単一の役に立たないクラスを追加すると、問題を解決できるようです:
私の場合、実行のIDをdefault-jarとして設定しましたが、エラーはなくなりました。例えば.
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>