Maven Shade Plugin - 排除一些我的类被重定位过程修改

标签 maven maven-plugin maven-shade-plugin

我正在使用 Maven Shade 插件来重新定位 Apache 的一些类。 我面临的问题是我将此字符串作为我的类(class)的一部分:

private static final String ORG_APACHE_HTTP_HTTP_REQUEST = "org.apache.http.HttpRequest"

但是 Maven Shade 插件将其更改为

private static final String ORG_APACHE_HTTP_HTTP_REQUEST = "com.company.dependencies.org.apache.http.HttpRequest"

有没有办法让我的类不被 Maven Shade 插件修改?

当前配置

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <minimizeJar>false</minimizeJar>
                <relocations>
                    <relocation>
                        <pattern>org.apache</pattern>
                        <shadedPattern>com.company.org.apache</shadedPattern>
                        <excludes>
                            <exclude>com.company.ClassToBeExcluded</exclude>
                        </excludes>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>

最佳答案

这有两个方面:

  • 您有一个类:com.company.ClassToBeExcluded
  • 此类包含一个具有以下值的字符串:“org.apache.http.HttpRequest”

阴影插件将尝试通过(a)重新定位类和(b)更新它假定的类引用(尽管嵌入在字符串中)来对这两者进行操作。

为了防止阴影插件更新字符串,您必须将 org.apache.http.HttpRequest 的重定位设置为无操作,如下所示:

<relocation>
    <pattern>org.apache.http.HttpRequest</pattern>
    <shadedPattern>org.apache.http.HttpRequest</shadedPattern>
</relocation>

如果您愿意,您可以像这样重新定位com.company.ClassToBeExcluded...

<relocation>
    <pattern>com.foo.TheClass</pattern>
    <shadedPattern>shaded.com.foo.TheClass</shadedPattern>
</relocation>

…但是只要你告诉shade不要重新定位org.apache.http.HttpRequest,那么该类中的ORG_APACHE_HTTP_HTTP_REQUEST就不会被更新。

注意:org 是一个非常流行的域名,因此您可能已经重新定位它,如果是这样,那么只需确保为 org.apache.http 定义无操作重新定位.HttpRequest 高于 org 的重定位。

我已经通过创建一个包含 private static Final String ORG_APACHE_HTTP_HTTP_REQUEST = "org.apache.http.HttpRequest" 的类来验证这一点:com.foo.TheClass。然后我针对包含此类的模块运行阴影插件,该类被重新定位,并且 ORG_APACHE_HTTP_HTTP_REQUEST 被更新。然后我添加了这个重新定位:

<relocation>
    <pattern>org.apache.http.HttpRequest</pattern>
    <shadedPattern>org.apache.http.HttpRequest</shadedPattern>
</relocation>

...并运行了阴影插件,此类已重新定位,但 ORG_APACHE_HTTP_HTTP_REQUEST 未更新。我还删除了 com.foo.TheClass 的重定位,并重新运行了阴影插件,该类没有重定位,ORG_APACHE_HTTP_HTTP_REQUEST 也没有更新。

这已使用 v3.0.0 的阴影插件进行了验证。

注意:这有点笨拙,因为您可能想要重新定位类,但(可以理解)不希望更新内部类属性。如果这对您来说是一个问题,那么您可能想为此问题投票 MSHADE-156 .

关于Maven Shade Plugin - 排除一些我的类被重定位过程修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45328585/

相关文章:

maven - 在一个多模块的maven项目中,我可以制作一个模块来根据另一个模块的DependencyReducedPom计算传递依赖吗?

maven - Maven的聚合模型如何遵守其依赖机制?

java - Spring 社会融合

maven-surefire-plugin 忽略 pom.xml 中的插件顺序

java - Maven 和 POM.xml 中的插件

java - Maven 仅在阴影 Jar 中包含依赖项

java - Maven 依赖项 :copy-dependencies -- Get javadoc and sources

Java 9 + maven + junit : does test code need module-info. java 自己的,放在哪里?

java - 如何将 src/test/java 内容添加到创建的输出 maven jar

java - 在 maven shade 插件中包含依赖项