【问题标题】:jar conflict in two applications - maven-shade-plugin relocation两个应用程序中的 jar 冲突 - maven-shade-plugin 重定位
【发布时间】:2018-06-27 19:19:26
【问题描述】:

我需要有关 maven-shade-plugin 的帮助。 我有一个应用程序 A 计划添加应用程序 B 的客户端。问题是,应用程序 A 和应用程序 B 都使用一个库(我们称之为冲突库),但版本不同。我无法更改任何这些应用程序中的版本,因为它们依赖于不同版本的 Jersey。 有人告诉我 maven-shade-plugin 应该能够解决这个问题。 我查阅了一些示例并阅读了文档,但我对它的工作原理并不完全了解。

我在应用程序“B”的 pom.xml 中添加了以下 sn-p。 我要在应用程序 A 中添加应用程序 B 依赖项。我需要添加转换器吗?有什么需要添加/排除的吗?提前致谢。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <minimizeJar>true</minimizeJar>
                    <relocations>
                        <relocation>
                            <pattern>com.conflict.lib</pattern>
               <shadedPattern>shaded.com.conflict.lib</shadedPattern>
                        </relocation>
                    </relocations>
                </configuration>
            </execution>
        </executions>
</plugin>

这将如何运作?当我运行 mvn install 时,我在控制台中看到以下内容

Replacing original artifact with shaded artifact.
[INFO] Replacing /Users/.../application-b-client/target/application-b-client-1.0.2-SNAPSHOT.jar with /Users/.../application-b-client/target/application-b-client-1.0.2-SNAPSHOT-**shaded**.jar
[INFO] Dependency-reduced POM written at: /Users/.../application-b-client/dependency-reduced-pom.xml

此着色工件不在我的 .m2 文件夹中。它就在我的项目目标文件夹中。我应该在我的应用程序“A”的 pom.xml 中放入什么? 目前我只有:

    <dependency>
        <groupId>com.my</groupId>
        <artifactId>application-b-client</artifactId>
        <version>1.0.2-SNAPSHOT</version>
    </dependency>

我应该用 1.0.2-SNAPSHOT.shaded 版本替换它吗?

【问题讨论】:

    标签: java spring maven maven-shade-plugin


    【解决方案1】:

    乍一看,这对我来说是正确的。

    阴影 .jar 替换原始 .jar - 所以不要期望在您的存储库中找到两者。

    如果一切按预期进行,application-b-client-1.0.2-SNAPSHOT.jar 文件中应该有一个名为“shaded”的包,其中包含重新定位的包。不是这样吗?

    编辑:

    这个客户端 jar 也在其他项目中使用,但是 无阴影版

    如果您(或客户)以后需要原始和阴影.jars,您可以添加以下配置:

    <shadedArtifactAttached>true</shadedArtifactAttached>
    <shadedClassifierName>shaded</shadedClassifierName>
    

    不是替换原件,而是将阴影.jar 附加到原件上另外

    然后您可以使用以下任一方法来获取工件:

    <!-- This is the original non-shaded artifact -->
    <dependency>
        <groupId>com.my</groupId>
        <artifactId>application-b-client</artifactId>
        <version>1.0.2-SNAPSHOT</version>
    </dependency>
    

    -或-

    <!-- This is the shaded artifact -->
    <dependency>
        <groupId>com.my</groupId>
        <artifactId>application-b-client</artifactId>
        <version>1.0.2-SNAPSHOT</version>
        <classifier>shaded</classifier>
    </dependency>
    

    【讨论】:

    • 我的目标文件夹现在有 original-application-b-client-1.0.2-SNAPSHOT.jar 和 application-b-client-1.0.2-SNAPSHOT.jar。这是否意味着没有“原始”的版本是阴影版本?我怎样才能验证这一点?它是否在包结构中创建了一个阴影文件夹?我没有看到那样的东西。我可以使用包含字符串 "shaded" 的名称创建带阴影的 jar 吗?
    • 完全正确 - 没有“原始”的版本是阴影版本。为了验证它,您可以解压缩.jar - 里面应该有一个“阴影”文件夹。如果没有,说明配置有问题。
    • 您可以使用 finalName 配置属性更改阴影工件的名称,例如&lt;finalName&gt;${project.artifactId}-${project.version}-shaded&lt;finalName&gt;。但是,我会反对这一点并使用默认名称。
    • 我明白了,因为这个客户端 jar 也在其他项目中使用,但没有阴影版本。我将解压并检查里面是否有阴影文件夹。
    • 我检查了jar,它没有阴影文件夹:(
    猜你喜欢
    • 2016-05-21
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2020-01-02
    • 2015-05-04
    相关资源
    最近更新 更多