我正在使用 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/