我正在使用Maven Shade插件重定位某些类的Apache。 我面临的问题是我将这个字符串作为我课程的一部分:
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>
答案 0 :(得分:0)
这有两个方面:
阴影插件将尝试通过以下方式对这两者进行操作:(a)重新定位类;(b)更新它所假设的类引用(尽管嵌入在字符串中)。
为防止树荫插件更新字符串,您必须将org.apache.http.HttpRequest
重新定位为no-op,如下所示:
<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>
...但只要您告诉不要重新定位org.apache.http.HttpRequest
,那么该类中的ORG_APACHE_HTTP_HTTP_REQUEST
将不会更新。
注意:org
是一个非常受欢迎的域名,因此您可能已经将其重新定位,如果是这样,那么请确保为org.apache.http.HttpRequest
定义上述>的无操作重定位 org
的重新定位。
我通过创建一个包含com.foo.TheClass
的类private static final String ORG_APACHE_HTTP_HTTP_REQUEST = "org.apache.http.HttpRequest”
来验证这一点。然后,我对包含此类的模块运行了shade插件,并重新定位了类,并更新了ORG_APACHE_HTTP_HTTP_REQUEST
。然后我添加了这个重定位:
<relocation>
<pattern>org.apache.http.HttpRequest</pattern>
<shadedPattern>org.apache.http.HttpRequest</shadedPattern>
</relocation>
...并运行了shade插件,此类已重新定位,但ORG_APACHE_HTTP_HTTP_REQUEST
未更新。我还删除了com.foo.TheClass
的重定位并重新运行了shade插件,并且没有重新定位类,并且ORG_APACHE_HTTP_HTTP_REQUEST
没有更新。
使用v3.0.0的阴影插件验证了这一点。
注意:这有点笨拙,因为您可能想要重新定位类,但(可以理解)不希望更新内部类属性。如果这对您来说是一个问题,那么您可能需要对此问题进行投票MSHADE-156。