参数资源的阴影:在类org.apache.maven.plugins.shade.resource.ManifestResourceTransformer中找不到“资源"

问题描述:

我正在做一个Maven项目.我正在尝试将jmh基准测试集成到我的项目中.我的Maven项目的pom.xml ...

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>

当我使用"mvn clean install"构建项目时,出现以下错误

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.

在我的情况下,原因是包含maven-shade-plugin配置以及我自己的pom的父pom. Maven合并这些文件的方式无法正确解决.看来Maven按照transformer标签的显示顺序对其进行了匹配并将其合并.

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.

要弄清楚这一点,请使用mvn help:effective-pom并查找生成的maven-shade-plugin配置.在我的情况下,在ManifestResourceTransformer中添加了<resource>标记,并且此资源与父pom的maven-shade-plugin配置中的第一个条目匹配.

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.

<execution>中添加<id>可以消除此问题:

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>
...

我怀疑这两种配置都使用相同的默认ID.因此,关键在于插件的每次执行都具有唯一的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.