Maven:包含与其他依赖冲突的捆绑库的第三方jar



这几天我一直在寻找这个问题的答案,却一无所获。

我正在开发一个与第三方应用程序集成的Confluence插件。这个第三方应用程序有一个很好的REST API,他们甚至提供了一个Java SDK(耶!)除了……Java SDK捆绑了一个版本的Jersey(1.18),这个版本与Confluence的分支版本Jersey (1.8-atlassian_15)冲突。SDK没有作为Maven jar发布(或者至少没有包含pom.xml)。在jar的META-INF中还有其他的pom.xml用于它所使用的依赖项,但是SDK本身只是作为一个由供应商下载的jar发布。

就像我过去所做的那样,我用我自己的groupId和artifactId mvn install:install-file这个笨蛋,认为它会很好。Intellij识别了这个库,一切都编译得很好,然后我尝试了对REST API的测试调用。这是当它抛出一个错误,表明有明显的版本之间的冲突。

如此如此。有什么办法可以绕开这个问题吗?我是否可以"沙箱"SDK jar,让它在自己的交易中执行代码,而不暴露于SDK使用的Confluence内置库版本的麻烦?我有一种感觉,即使解决了泽西岛的依赖(如果可能的话),也会有其他问题....SDK还捆绑了特定版本的Jackson, Swagger等。

我试图反编译jar并将反编译的代码包含在我的项目中,但这只是我不想再处理的所有问题。

我已经联系了SDK开发人员,看看他们是否可以发布一个更maven友好的版本,但我不希望这将被完成,即使是,他们的发布周期与我自己的需求大不相同(阅读:我现在需要一个解决方案)。这是我在从头重写REST客户端之前最后的努力。

我是否可以"沙箱"SDK jar,让它在自己的交易中执行代码,而不暴露于SDK使用的Confluence内置库版本的麻烦?

你当然可以。通常使用的方法是使用Maven阴影插件,它将现有的jar转换为阴影jar,使用另一个包层次结构并消除包命名冲突。另请参阅关于重定位包的文档。我建议你使用它——这就是我在这种情况下所做的(虽然我没有做过合流插件开发,但它应该与其他平台一样)。

最新更新