Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IDE(intelliJ)、mvn测试和mvn包中的JAR地狱:如何在所有设置中统一依赖项重新定位?_Java_Maven_Jar_Dependency Management_Maven Shade Plugin - Fatal编程技术网

Java IDE(intelliJ)、mvn测试和mvn包中的JAR地狱:如何在所有设置中统一依赖项重新定位?

Java IDE(intelliJ)、mvn测试和mvn包中的JAR地狱:如何在所有设置中统一依赖项重新定位?,java,maven,jar,dependency-management,maven-shade-plugin,Java,Maven,Jar,Dependency Management,Maven Shade Plugin,对我来说很简单: 我正在使用两个非常流行但相互冲突的scala库:Spark SQL和JSON4s。每种方法都取决于Jackson XML解析器的不同版本 因为除了我自己的程序之外,没有人在使用JSON4s,所以一个简单的解决方案是将包org.JSON4s.jackson和com.fasterxml.jackson迁移到新的位置 但是,maven shade插件只能在打包过程中执行此操作,因为所有测试和IDE运行都是在打包过程之前进行的。这仍然会导致所有测试失败,无论是在IDE中的mvn测试还是

对我来说很简单: 我正在使用两个非常流行但相互冲突的scala库:Spark SQL和JSON4s。每种方法都取决于Jackson XML解析器的不同版本

因为除了我自己的程序之外,没有人在使用JSON4s,所以一个简单的解决方案是将包
org.JSON4s.jackson
com.fasterxml.jackson
迁移到新的位置

但是,maven shade插件只能在打包过程中执行此操作,因为所有测试和IDE运行都是在打包过程之前进行的。这仍然会导致所有测试失败,无论是在IDE中的mvn测试还是scala测试中运行


是否有一个插件可以为所有三种情况共同管理包重定位策略:JAR打包/mvn测试/iderun?我在互联网上搜索了一整天,没有找到答案。

我们通过重新编译(和修补)来对齐库,从而解决了这个问题。任何与阴影相关的东西都会倾向于一个版本而不是另一个版本,这意味着你可能在一个库中修复的东西可能会在另一个库中破坏

对于那些来自OSGi阵营的评论,是的,这就是OSGi想要解决的问题,但在Spark环境中,它的效果并不好:)


您是否考虑过降级这两个版本中的一个以调整资源?通常情况下,其中一个库会设法首先发布,而第二个库只落后一点。。。有时,可以在运行与“最后一次发布”项目一致但较旧的版本时找到答案。

Jackson的不同版本是什么?您可以覆盖自己的pom.xml中的一个依赖项,以便只存在一个实例。您不会相信这一点:3.2.10(Spark)与3.2.11(我的代码)。如果Spark jackson被覆盖为3.2.11,则它有classNotFound错误,如果我将jackson更改为3.2.10,则我的一些测试和功能中断。所以我现在处于进退两难的境地,我只是半开玩笑,但是使用OSGi加载两个版本…否则,您不能在自己的组ID中创建所需库的重新定位版本吗?克隆、移动/重命名、mvn安装并直接重用?是否可以选择使用与Spark相同的jackson的旧版本JSON4s?这听起来比我想象的要困难得多:我过去认为着色工件只是重命名了包,可以与未着色工件共存(只要其中一个是我自己专用的,而不是其他图书馆使用).我以前也曾在其他情况下降级过,但在本例中,json4s jackson 3.11提供了一些重要的功能,这些功能几乎不可能在旧版本上实现version@tribbloid您不会喜欢这个,但是阴影选项主要是为那些发现很难维护类路径的人提供的(因为它们是zip文件)并将它们复制到目标jar中(同样是zip文件),因此当您必须使用同一jar的不同版本时,着色通常会留下该jar的一个工作版本(最后一个)对那些知道旧jar的项的引用有时会中断,这取决于依赖类是否恰好与其替换项的功能相同。如果可能,并且如果您不想承担编译所有jar的需要,我会尝试找到一个所有库对齐的日期,然后升级/降级组件以获得您的支持esired版本。有时这意味着只需要修补和编译一些项目,而不是这个巨大的东西球。