Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

shade for parameter resource: Cannot find 'resource' in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer

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?

like image 776
neelrotno Avatar asked Apr 26 '17 06:04

neelrotno


People also ask

What is ManifestResourceTransformer?

The ManifestResourceTransformer allows existing entries in the MANIFEST to be replaced and new entries added. For example, the following sample sets. the Main-Class entry to the value of the app.main.class property, the X-Compile-Source-JDK entry to the value of the maven.compile.source property and.

What is Maven Shade plugin?

This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.

What is dependency reduced POM XML?

The dependency-reduced-pom. xml removes transitive dependencies which are already in your shaded jar. This prevents consumers from pulling them in twice.

What is Maven resources plugin?

The Resources Plugin handles the copying of project resources to the output directory. There are two different kinds of resources: main resources and test resources.


1 Answers

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.

like image 169
ash Avatar answered Oct 06 '22 13:10

ash