如何在非托管依赖项.jar文件中隔离库,以便它们不会与其他文件发生冲突

时间:2018-03-07 10:59:35

标签: scala sbt dependency-management conflicting-libraries

我需要将一个.jar添加为sbt Scala项目的非托管依赖项(它是java-stellar-sdk)。只要我不运行INCLUDE_PATH += -I/path/to/your/cimg LIBS += -L/usr/X11R6/lib -lm -lpthread -lX11 ,一切都运作良好。 .jar文件中似乎有一个Mockito版本与我在项目中使用的版本冲突。我发现很多错误,某些Mockito匹配器找不到,但是没有lib文件夹中的.jar,一切正常。

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

替代解决方案也会有很大帮助。是否有可能隔离罐中的库,使我能够让某个包对外部可见?

更新: .jar包含Mockito 2,但我的项目使用Mockito 1,所以这是一个非常简单明显的冲突,我可以通过升级到Mockito 2来解决(我尝试了它作品)。然而,问题仍然存在:是否有另一种合理的方法可以隔离.jar中的Mockito依赖关系,以防止我干扰我的项目,以防我无法或不想解决冲突购买切换到更新的有问题的库的版本。也许改变.jar来重命名冲突的包?我不知道。这样的事情。

我知道这是一个非常普遍的问题,可能已在其他地方进行了深入探讨。但是,我没有找到任何让我满意的东西。当然也赞赏与该主题的相关讨论的链接。

2 个答案:

答案 0 :(得分:3)

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

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

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

  3. 在jar中模拟mockito文件 着色是通过某些规则重命名jar文件中的所有文件的过程。您可以使用jarjarlinkssbt assembly插件。看到这个答案让你开始使用sbt assembly:https://stackoverflow.com/a/47974750/245024

答案 1 :(得分:1)

你应该可以安排你的Mockito 1课程出现在课程路径上的Mockito 2课程之前。这将使你的课程赢得任何冲突。