I'm working on a maven project. I'm trying to integrate jmh benchmarking into my project. The pom.xml of my maven project...
<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>
When I build my project using "mvn clean install", I got following error
[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]
I don't understand why this error is happening?
Found a cause of this affecting my own setup and am sharing here in case it helps others.
In my case, the cause is a parent pom containing the maven-shade-plugin
configuration as well as my own pom. The way that Maven merges these works out incorrectly. It appears the Maven is matching the transformer
tags in the order they appear and merging them.
To figure this out, use mvn help:effective-pom
and look for the resulting maven-shade-plugin
configuration. In my case, a <resource>
tag was added to the ManifestResourceTransformer
, and this resource matched the first entry in the parent pom's maven-shade-plugin
configuration.
Adding an <id>
to the <execution>
eliminates the problem:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade-my-jar</id>
...
I suspect both configurations were using the same, default ID. So the key is that each execution of the plugin have a unique id.