私はMavenプロジェクトに取り組んでいます。 jmhベンチマークをプロジェクトに統合しようとしています。私のMavenプロジェクトのpom.xml ...
<parent>
<groupId>platform</groupId>
<artifactId>platform-root</artifactId>
<version>3.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>platform-migration</artifactId>
<packaging>jar</packaging>
<name>Platform Migration</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compile.source>1.7</maven.compile.source>
<maven.compile.target>1.7</maven.compile.target>
<jmh.version>1.1.1</jmh.version>
<jersey-version>2.22.1</jersey-version>
<uberjar.name>rest-benchmarks</uberjar.name>
</properties>
<dependencies>
<dependency>
<groupId>platform</groupId>
<artifactId>platform-commons</artifactId>
<version>${platform.version}</version>
</dependency>
<dependency>
<groupId>platform</groupId>
<artifactId>platform-persistence</artifactId>
<version>${platform.version}</version>
</dependency>
<dependency>
<groupId>platform</groupId>
<artifactId>platform-testing</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
「mvncleaninstall」を使用してプロジェクトをビルドすると、次のエラーが発生しました
[ERROR] Failed to execute goal org.Apache.maven.plugins:maven-shade-plugin:3.0.0:shade (default) on project platform-migration: Unable to parse configuration of mojo org.Apache.maven.plugins:maven-shade-plugin:3.0.0:shade for parameter resource: Cannot find 'resource' in class org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer -> [Help 1]
このエラーが発生している理由がわかりませんか?
私自身の設定に影響を与えるこの原因を見つけ、他の人に役立つ場合に備えてここで共有しています。
私の場合、原因はmaven-shade-plugin
構成を含む親pomと私自身のpomです。 Mavenがこれらをマージする方法は正しく機能しません。 Mavenはtransformer
タグを表示順に照合し、それらをマージしているようです。
これを理解するには、mvn help:effective-pom
を使用して、結果のmaven-shade-plugin
構成を探します。私の場合、<resource>
タグがManifestResourceTransformer
に追加され、このリソースは親pomのmaven-shade-plugin
構成の最初のエントリと一致しました。
<id>
を<execution>
に追加すると、問題が解消されます。
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade-my-jar</id>
...
両方の構成で同じデフォルトIDが使用されていたと思われます。したがって、重要なのは、プラグインの実行ごとに一意のIDを持つことです。
ザ・ ManifestResourceTransformer 内の既存のエントリを許可します マニフェスト 置き換えられ、新しいエントリが追加されます。
たとえば、次のサンプルセット
<project>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>${app.main.class}</Main-Class>
<X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>
<X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
これが正しい構成だと思います