Maven Shade插件 - 不包括一些被重定位过程修改的我的类

时间:2017-07-26 13:35:42

标签: maven maven-plugin maven-shade-plugin

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

1 个答案:

答案 0 :(得分:0)

这有两个方面:

  • 您有一个课程:com.company.ClassToBeExcluded
  • 此类包含具有此值的String:“org.apache.http.HttpRequest”

阴影插件将尝试通过以下方式对这两者进行操作:(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