我正在开发一个将在我们公司内部使用的应用程序。为了使它与我们的其他内部系统互操作,我必须使用我们在内部使用的一些maven依赖项,但这会导致使用我需要的一些外部第三方依赖项的一些问题。
基本上我的pom看起来像这样:
<dependencies>
<dependency>
internal-framework-artifact
</dependency>
<dependency>
necessary-third-party-artifact
</dependency>
</dependencies>
我发现这两个依赖项都将apache的commons-collections
作为它们自己的依赖项之一(在众多其他依赖项中,但我们只是将它保持在一个以便这个问题的简单性)
如果我对commons-collections
pom的两个放置排除规则我可以编译项目,但是我生成的jar将无法访问任何版本的commons-collections
并且只会导致java.lang.NoClassDefFoundError
例外。删除其中任何一个的排除规则只会导致mvn编译器错误:
[警告]规则2:org.apache.maven.plugins.enforcer.BanDuplicateClasses失败并显示消息: 找到重复的课程:
我一直在寻找各种各样的q / a,我似乎无法找到与我的情况100%相关的东西。我真的不知道如何解决这个问题。我错过了一些非常明显的东西吗?
答案 0 :(得分:1)
我从未真正使用maven-shade-plugin
进行着色,但我认为这是它的设计用例。
创建一个使用maven-shade-plugin
的新项目(请参阅:http://maven.apache.org/plugins/maven-shade-plugin/)以生成internal-framework-artifact
的超级jar版本,其中包含internal-framework-artifact
及其所有类依赖。配置插件,以便将所有与necessary-third-party-artifact
的依赖关系的类重定位到一些非冲突的包名称。这个新项目应该生成一个名称不同的.jar,例如internal-framework-artifact-with-dependencies
。
现在修改原始pom,使其取决于internal-framework-artifact-with-dependencies
,它应该有效。