【问题标题】:Maven Shade Plugin - Excluding some a class of mine from being modified by the relocation processMaven Shade Plugin - 排除我的一些类被重定位过程修改
【发布时间】:2017-07-26 13:35:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这有两个方面:

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

    shade 插件将尝试通过 (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

    我已经通过创建一个类来验证这一点:com.foo.TheClass 包含private static final String ORG_APACHE_HTTP_HTTP_REQUEST = "org.apache.http.HttpRequest”。然后我针对包含此类的模块运行了阴影插件,并且重新定位了该类并更新了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 的 shade 插件验证的。

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

    【讨论】:

    • 如果我理解正确,它会将类更改为其原始名称。问题是我不希望它改变类的 content
    • 我错过了什么吗?
    • 抱歉,我误解了。我现在已经用相关的解决方案更新了我的回答问题。
    猜你喜欢
    • 2015-05-04
    • 2014-09-05
    • 2018-06-27
    • 2013-04-11
    • 2013-11-28
    • 2022-07-19
    • 2013-08-19
    • 2013-02-19
    相关资源
    最近更新 更多