【问题标题】:shade for parameter resource: Cannot find 'resource' in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer参数资源的阴影:在类 org.apache.maven.plugins.shade.resource.ManifestResourceTransformer 中找不到“资源”
【发布时间】:2017-09-23 10:05:18
【问题描述】:

我正在做一个 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]

我不明白为什么会发生这个错误?

【问题讨论】:

    标签: maven benchmarking microbenchmark jmh


    【解决方案1】:

    找到了影响我自己设置的原因,并在这里分享以防它帮助其他人。

    就我而言,原因是包含maven-shade-plugin 配置的父pom 以及我自己的pom。 Maven 合并这些的方式不正确。 Maven 似乎按照 transformer 标签的出现顺序匹配它们并合并它们。

    要解决这个问题,请使用mvn help:effective-pom 并查找生成的maven-shade-plugin 配置。在我的例子中,&lt;resource&gt; 标签被添加到ManifestResourceTransformer,并且这个资源匹配父 pom 的maven-shade-plugin 配置中的第一个条目。

    &lt;id&gt; 添加到&lt;execution&gt; 可以消除问题:

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

    我怀疑两种配置都使用相同的默认 ID。所以关键是插件的每次执行都有一个唯一的id。

    【讨论】:

    • 如果需要阻止父执行运行,可以指定它的id,然后设置phase为“none”:parent-id
    【解决方案2】:

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

    例如下面的样本集

    • 主类条目到 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 plugin 3.1)中,它总是抱怨打包我的项目时找不到resource。我的配置是here
    【解决方案3】:

    你的配置看起来不对:

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

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2013-03-17
      相关资源
      最近更新 更多