web-dev-qa-db-ja.com

Maven JAR Plugin 3.0.2エラー:補助的なアーティファクトを置き換えるのではなく、プロジェクトにアタッチするには、分類子を使用する必要があります

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です。

  • クラス/リソースが存在するかどうかは問題ではないようです。とにかく上記のエラーメッセージが表示されます。
  • この問題は、2つの目標(jarおよびtest-jar)が指定されている場合にも発生します。
  • 目標なしが指定されている場合、問題は発生しません。ただし、jartest-jarの両方が本当に必要なので、これはオプションではありません。

ドキュメント によると、classifierは同じ目標の複数の呼び出しでのみ指定する必要があり、test-jar目標には妥当なデフォルトがありますが、これは意図していません変化する。

また、この問題は、JARプラグインの2.x行には表示されないようです。

私は何か見落としてますか?誰かが私が間違っていることを提案してもらえますか?

追伸Mavenバージョンは3.3.9です。

24
Alex Shesterov

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が指定されていないことに注意してください。

36
Tunaki

ログに次のように表示される場合:

[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に単一の役に立たないクラスを追加すると、問題を解決できるようです:

http://maven.40175.n5.nabble.com/quot-mvn-clean-verify-deploy-quot-causes-jar-plugin-to-execute-twice-td5877166.html

3
Wolfgang Fahl

私の場合、実行のIDをdefault-jarとして設定しましたが、エラーはなくなりました。例えば.

<execution>
    <id>default-jar</id>
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>
3
Derik