如何隔离非托管依赖 .jar 文件中的库,以免它们与其他库发生冲突

How to isolate libraries in an unmanaged dependency .jar file so they don't conflict with others

我需要将 .jar 作为非托管依赖项添加到 sbt Scala 项目(它是 java-stellar-sdk)。只要我不 运行 sbt test,一切都很好。 .jar 文件中似乎有一个 Mockito 版本与我在项目中使用的版本冲突。我收到很多错误,找不到某些 Mockito 匹配器,但在 lib 文件夹中没有 .jar 的情况下一切正常。

有没有办法告诉 sbt 它应该忽略 .jar 中的某些库或者托管依赖项优先?我也找到了 this related question 但显然它对我没有帮助。

替代解决方法也会有很大帮助。是否可以通过某种方式隔离 jar 中的库,让我只让某个包对外部可见?

更新: .jar 包含 Mockito 2 但我的项目使用 Mockito 1,所以这是一个非常简单和明显的冲突,我可以通过升级到 Mockito 2 来解决(我试过了并且有效)。但是,问题仍然存在:是否有另一种合理的方法来隔离 .jar 中的 Mockito 依赖项,以防万一我不能或不想解决冲突购买切换到更新版本的库时不干扰我的项目有问题。也许改变 .jar 来重命名冲突的包?我不知道。诸如此类。

我知道这是一个非常笼统的问题,可能已经在其他地方进行了深入讨论。但是,我没有找到任何让我真正满意的东西。当然也欢迎链接到该主题的相关讨论。

我可以想出3种方法给你(从简单到困难排序):

  1. 从 jar 文件中手动删除 mockito 2。
    由于jar只是一个zip文件,您可以将其解压,删除所有冲突文件,然后重新打包。

  2. 自己从源代码编译该 jar,并将 mockito 设置为测试依赖项(应该如此)。如果你这样做,请考虑用你的更改打开 PR,以解决社区的问题

  3. 遮蔽 jar 中的 mockito 文件。
    shading是将一个jar文件中的所有文件按照一定的规则重新命名的过程。你可以使用 jarjarlinks or with sbt assembly plugin. see this answer to get you started with sbt assembly:

您应该能够安排您的 Mockito 1 类 在类路径中出现在 Mockito 2 类 之前。这将导致您的 类 赢得任何冲突。