首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Maven创建JarJar'd工件,其中使用工件不会拉出传递依赖关系?

如何使用Maven创建JarJar'd工件,其中使用工件不会拉出传递依赖关系?
EN

Stack Overflow用户
提问于 2011-04-20 03:34:11
回答 3查看 3.8K关注 0票数 11

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

这可以很好地执行,并且我的库可以作为依赖项被拉入,没有问题。

但是,因为我的项目在ASM上有编译范围的依赖项,所以每当客户端项目添加我的库时,传递依赖项都会被拉入。因此,假设,如果他们使用ASM的特定版本,并且他们还将我所依赖的版本添加到类路径中,则它们具有未定义的行为。我希望避免这种情况,并允许客户端依赖于JarJar'd工件,而不会让Maven在不必要和潜在危险的情况下删除传递依赖项。

如何创建用户可以依赖的JarJar'd工件,而不提取传递依赖关系?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-20 16:53:50

我找到了这个问题的解决方案,抛弃了jarjar-maven-plugin,恢复到maven-shade-plugin。这允许在您自己的名称空间中重新打包类,设置jar的主类,最重要的是,重写生成的pom以不包括现在捆绑在一起的编译时依赖项。

我的pom.xml中获得这一点的部分是:

代码语言:javascript
复制
<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将替换通常会产生的主要工件。此默认值为false,但值得指出的是out.
  • createDependencyReducedPom,当设置为true时,这意味着当部署或安装着色jar时,部署的pom.xml将不包括已重新打包到jar.
  • relocation中的编译范围依赖项。这些元素配置如何将依赖项中的文件重新打包到着色jar中。在上面的示例中,任何规范名称以org.objectweb.asm开头的类都将被移动到${package.base}.org.objectweb.asm,因此当打包到jar中时,将在jar中具有等效的文件路径。

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

票数 17
EN

Stack Overflow用户

发布于 2011-04-20 10:24:23

考虑尝试maven-shade-plugin,它允许各种精细控制。

票数 1
EN

Stack Overflow用户

发布于 2011-04-20 10:00:29

也许设置<optional>属性会在您的情况下起作用。在您的java测试库pom中指定类似以下内容。

代码语言:javascript
复制
  <dependencies>
    <dependency>
      <groupId>asm.group</groupId>
      <artifactId>asm</artifactId>
      <version>x.y</version>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5721647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档