我目前有一个Java测试库,它是用Maven构建的,并作为jar分发。我的项目依赖于一个非常通用的库(Objectweb ASM),并且我遇到过一些问题,因为类路径中已经存在一个早期的、不兼容的ASM版本。因此,我已经开始使用jarjar-maven-plugin来创建jar,在内部重新打包ASM,这样它就不会与其他版本的ASM冲突。
这可以很好地执行,并且我的库可以作为依赖项被拉入,没有问题。
但是,因为我的项目在ASM上有编译范围的依赖项,所以每当客户端项目添加我的库时,传递依赖项都会被拉入。因此,假设,如果他们使用ASM的特定版本,并且他们还将我所依赖的版本添加到类路径中,则它们具有未定义的行为。我希望避免这种情况,并允许客户端依赖于JarJar'd工件,而不会让Maven在不必要和潜在危险的情况下删除传递依赖项。
如何创建用户可以依赖的JarJar'd工件,而不提取传递依赖关系?
发布于 2011-04-20 16:53:50
我找到了这个问题的解决方案,抛弃了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将替换通常会产生的主要工件。此默认值为false,但值得指出的是out.createDependencyReducedPom,当设置为true时,这意味着当部署或安装着色jar时,部署的pom.xml将不包括已重新打包到jar.relocation中的编译范围依赖项。这些元素配置如何将依赖项中的文件重新打包到着色jar中。在上面的示例中,任何规范名称以org.objectweb.asm开头的类都将被移动到${package.base}.org.objectweb.asm,因此当打包到jar中时,将在jar中具有等效的文件路径。使用此配置,当部署我的项目时,当客户端在我的项目上声明编译范围依赖项时,它只拉入阴影jar,而没有传递依赖项。
发布于 2011-04-20 10:24:23
考虑尝试maven-shade-plugin,它允许各种精细控制。
发布于 2011-04-20 10:00:29
也许设置<optional>属性会在您的情况下起作用。在您的java测试库pom中指定类似以下内容。
<dependencies>
<dependency>
<groupId>asm.group</groupId>
<artifactId>asm</artifactId>
<version>x.y</version>
<optional>true</optional>
</dependency>
...
</dependencies>https://stackoverflow.com/questions/5721647
复制相似问题