【问题标题】:maven-shade-plugin doesn't replace the original jarmaven-shade-plugin 不会替换原来的 jar
【发布时间】:2020-01-02 06:12:21
【问题描述】:

奇怪的是,我的 maven-shade-plugin 没有用阴影 jar 替换原来的 jar。有谁知道可能是什么原因?

这是我在 pom.xml 中的插件

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>${plugin.shade.version}</version>
    <configuration>
      <artifactSet>
        <excludes>
          <!-- Leave slf4j unshaded so downstream users can configure logging. -->
          <exclude>org.slf4j:slf4j-api</exclude>
          <exclude>org.slf4j:slf4j-log4j12</exclude>
          <!-- Leave commons-logging unshaded so downstream users can configure logging. -->
          <exclude>commons-logging:commons-logging</exclude>
          <!-- Leave commons-exec unshaded so downstream users can use ProcessLauncher. -->
          <exclude>org.apache.commons:commons-exec</exclude>
          <!-- Leave log4j unshaded so downstream users can configure logging. -->
          <exclude>log4j:log4j</exclude>
        </excludes>
      </artifactSet>
      <filters>
        <filter>
          <artifact>*:*</artifact>
          <excludes>
            <exclude>META-INF/*.SF</exclude>
            <exclude>META-INF/*.DSA</exclude>
            <exclude>META-INF/*.RSA</exclude>
          </excludes>
        </filter>
      </filters>
      <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
          <resource>reference.conf</resource>
        </transformer>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/>
        <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
          <resource>NOTICE.txt</resource>
        </transformer>
        <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
          <resource>META-INF/LICENSE.txt</resource>
          <file>${basedir}/../../LICENSE.txt</file>
        </transformer>
        <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
          <resource>META-INF/NOTICE.txt</resource>
          <file>${basedir}/../../NOTICE.txt</file>
        </transformer>
      </transformers>
      <relocations>
        <relocation>
          <pattern>org</pattern>
          <shadedPattern>${shaded.dependency.prefix}.org</shadedPattern>
          <excludes>
            <exclude>org/apache/zeppelin/*</exclude>
            <exclude>org/apache/zeppelin/**/*</exclude>
            <exclude>org/apache/thrift/*</exclude>
            <exclude>org/apache/thrift/**/*</exclude>
            <exclude>org/slf4j/*</exclude>
            <exclude>org/slf4j/**/*</exclude>
            <exclude>org/apache/commons/logging/*</exclude>
            <exclude>org/apache/commons/logging/**/*</exclude>
            <exclude>org/apache/commons/exec/*</exclude>
            <exclude>org/apache/commons/exec/**/*</exclude>
            <exclude>org/apache/log4j/*</exclude>
            <exclude>org/apache/log4j/**/*</exclude>
            <exclude>org/sonatype/*</exclude>
            <exclude>org/sonatype/**/*</exclude>
            <exclude>**/pom.xml</exclude>

            <!-- Not the org/ packages that are a part of the jdk -->
            <exclude>org/ietf/jgss/*</exclude>
            <exclude>org/omg/**/*</exclude>
            <exclude>org/w3c/dom/*</exclude>
            <exclude>org/w3c/dom/**/*</exclude>
            <exclude>org/xml/sax/*</exclude>
            <exclude>org/xml/sax/**/*</exclude>
          </excludes>
        </relocation>
        <relocation>
          <pattern>com.google</pattern>
          <shadedPattern>${shaded.dependency.prefix}.com.google</shadedPattern>
        </relocation>
        <relocation>
          <pattern>io</pattern>
          <shadedPattern>${shaded.dependency.prefix}.io</shadedPattern>
        </relocation>
        <relocation>
          <pattern>com.esotericsoftware</pattern>
          <shadedPattern>${shaded.dependency.prefix}.com.esotericsoftware</shadedPattern>
        </relocation>
      </relocations>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

【问题讨论】:

  • 您当前的设置是否在常规 JAR 旁边创建阴影 JAR?执行mvn package 时是否看到插件正在运行?包含&lt;plugin&gt;定义的pom XML标签是什么,是&lt;plugins&gt;还是&lt;pluginManagement&gt;
  • 我可以看到maven-shade-plugin在maven log中被执行了。
  • 请添加mvn -X clean package 输出,也请回答我提出的其他问题。

标签: java maven maven-shade-plugin


【解决方案1】:

阴影插件默认将原始文件保存为-original.jar,如果您想用新生成的(阴影)替换原始文件,请将这一行放在您的配置插件部分:

<configuration>
    ...

    <outputFile>${output.directory}\${project.artifactId}-${project.version}.jar</outputFile>
    ...
</configuration>

将 output.directory 替换为您的阴影插件 outputDirectory。

查看此帖子了解更多详情:post

【讨论】:

    【解决方案2】:

    看起来配置标签应该在层次结构中的执行标签内,如下所示。请重新组织执行和执行标签,并在其下包含您的配置,如下所示。

    <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>${maven.shade.plugin}</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <relocations>
                                    <relocation>
                                        <pattern>org.apache*</pattern>
                                        <shadedPattern>shaded.org.apache*</shadedPattern>
                                    </relocation>
                                    <relocation>
                                        <pattern>com.cookie*</pattern>
                                        <shadedPattern>shaded.com.cookie*</shadedPattern>
                                    </relocation>
                                </relocations>
    
                            </configuration>
                        </execution>
                    </executions>
    
                </plugin>
    
            </plugins>
    

    更多信息请参考maven文档http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

    【讨论】:

    • 顶层配置被所有执行继承。
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2017-01-29
    • 2013-11-28
    • 2014-09-09
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多