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

21

我正在进行一个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>
当我使用“mvn clean install”构建我的项目时,出现以下错误。
[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]
我不明白为什么会发生这个错误?

3个回答

48

我发现了影响我的设置的原因,并在此分享,以帮助其他人。

在我的情况下,原因是含有 maven-shade-plugin 配置的父 POM 和我的 POM。Maven 合并它们的方式不正确,看起来是按照出现顺序匹配 transformer 标签并合并它们。

要找出问题所在,请使用 mvn help:effective-pom 命令,并查找生成的 maven-shade-plugin 配置。在我的情况下,<resource> 标签被添加到 ManifestResourceTransformer 中,并且这个资源匹配了父 POM 的 maven-shade-plugin 配置中的第一个条目。

通过向 <execution> 添加一个 <id> 可以解决此问题:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
      <execution>
        <id>shade-my-jar</id>
...

我怀疑两种配置都使用了相同的默认 ID。因此,关键是每次执行插件时都有一个唯一的 ID。


3
如果您需要防止父级执行运行,您可以指定其ID,然后将phase设置为"none": <execution><id>parent-id</id><phase>none</phase></execution>。 - Azuaron

0

ManifestResourceTransformer 允许替换 MANIFEST 中的现有条目并添加新条目。

例如,以下示例设置

  • 将 Main-Class 条目设置为 app.main.class 属性的值,
  • 将 X-Compile-Source-JDK 条目设置为 maven.compile.source 属性的值,以及
  • 将 X-Compile-Target-JDK 条目设置为 maven.compile.target 属性的值。

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

我认为这是正确的配置。


我遇到了相同的问题,上述两种配置都没有起作用。实际上,mainClassmanifestEntries都是被支持的。但在我的本地机器(Windows 10,Java 8,maven shade插件3.1)上,在打包项目时它总是抱怨找不到resource。我的配置在这里 - Hantsy

-1

您的配置看起来有误:

<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>xxxxxxxxxxx</Main-Class>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接