0

这几天我一直在寻找这个问题的答案,结果却是空的。

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

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

太棒了。有没有办法解决这个问题?我可以“沙盒”SDK jar 以一种在自己的交易中执行代码的方式,而不会暴露于 SDK 使用的 Confluence 内置版本的库的讨厌内容吗?我有一种感觉,即使解决了 Jersey 依赖项(如果可能的话),还会有其他问题.... SDK 还捆绑了特定版本的 Jackson、Swagger 等。

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

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

4

1 回答 1

0

我可以“沙盒”SDK jar 以一种在自己的交易中执行代码的方式,而不会暴露于 SDK 使用的 Confluence 内置版本的库的讨厌内容吗?

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

于 2016-09-15T06:04:35.057 回答