gpt4 book ai didi

maven - 如何使用 Maven 创建 JarJar'd Artifact ,其中使用 Artifact 不会拉取传递依赖关系?

转载 作者:行者123 更新时间:2023-12-04 01:50:04 28 4
gpt4 key购买 nike

我目前有一个用 Maven 构建的 Java 测试库,并作为 jar 分发。我的项目依赖于一个非常常见的库 (Objectweb ASM),而且我遇到了一些问题,即类路径中已经存在较早且不兼容的 ASM 版本。因此,我开始使用 jarjar-maven-plugin创建 jar,在内部重新打包 ASM,以免与其他版本的 ASM 冲突。

这执行得很好,我的库可以毫无问题地作为依赖项引入。

但是,因为我的项目对 ASM 有编译范围的依赖关系,所以每当客户端项目添加我的库时,传递的依赖关系也会全部拉进来。因此,假设,如果他们使用特定版本的 ASM,并且他们还将我依赖的版本添加到类路径中,则他们具有未定义的行为。我想避免这种情况,并允许客户端依赖 JarJar 的 Artifact ,而不必让 Maven 拉下不必要的和潜在危险的传递依赖项。

我如何创建一个 JarJar'd Artifact ,用户可以在不拉传递依赖项的情况下依赖它?

最佳答案

我通过放弃 jarjar-maven-plugin 并恢复到 maven-shade-plugin 找到了解决此问题的方法。这允许在您自己的命名空间内重新打包类,设置 jar 的主类,并且至关重要的是,重写生成的 pom 以不包含现在捆绑的编译时依赖项。

我的 pom.xml 实现这一点的部分是:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>

<shadedArtifactAttached>false</shadedArtifactAttached>
<createDependencyReducedPom>true</createDependencyReducedPom>

<relocations>
<relocation>
<pattern>org.objectweb.asm</pattern>
<shadedPattern>${repackage.base}.org.objectweb.asm</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${package.base}.my.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>

此配置的重要部分是:
  • shadedArtifactAttached当设置为 false 时,意味着阴影 jar 将替换通常会产生的主要 Artifact 。这默认为 false 但值得指出。
  • createDependencyReducedPom当设置为 true 时,意味着在部署或安装着色的 jar 时,部署的 pom.xml 将不包含已重新打包到 jar 中的编译范围依赖项。
  • relocation这些元素配置依赖项中的文件如何重新打包到阴影 jar 中。在上面的示例中,规范名称以 org.objectweb.asm 开头的任何类将移至 ${package.base}.org.objectweb.asm ,因此当打包在 jar 中时将在 jar 中具有等效的文件路径。

  • 使用此配置,当我的项目部署时,当客户端声明对我的项目的编译范围依赖项时,它只会拉入阴影 jar,而没有传递依赖项。

    关于maven - 如何使用 Maven 创建 JarJar'd Artifact ,其中使用 Artifact 不会拉取传递依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721647/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com