Gradle中传递依赖的不同版本

时间:2016-08-01 10:46:15

标签: gradle jetty transitive-dependency

在我的项目中,我被迫使用这些包:

  • com.sparkjava:spark-core:2.3,最终使用jetty-server:9.3.2.v20150730
  • org.apache.spark:spark-core_2.10:1.2.0,最终使用jetty-server:8.1.14.v20131031

请注意,com.sparkjavaorg.apache.spark彼此无关。它们被有趣地称为 spark

这里的问题是两个jetty版本都不兼容,所以如果我强制jetty 8.X系统崩溃,如果我强制jetty 9.X系统再次崩溃,我会在一个案例中得到java.lang.NoClassDefFoundError: org/eclipse/jetty/server/ServerConnector另一个是java.lang.NoClassDefFoundError: org/eclipse/jetty/server/bio/SocketConnector

在这种情况下我应该做些什么?

注意:我尝试过遮挡码头,但依赖管理器只解析一个(默认情况下为9.X,如果我强制它则为8.X)然后它会遮住它,所以它会解决它真的没有帮助。

1 个答案:

答案 0 :(得分:1)

解决这种情况非常困难。

Jetty 8.1大约是Jetty 9.3背后的4个主要版本,它代表了数百个版本的差异。

  

注意:Jetty版本控制是[servlet_support]。[major_ver]。[minor_ver]。

     

Jetty 8.x是Servlet 3.0,而Jetty 9.x是Servlet 3.1

连接器的体系结构在这段时间内发生了巨大变化,从Jetty 8中的旧学校阻塞套接字到Jetty 9中完全没有阻塞连接器,Jetty 9需要改进连接器以支持TLS / 1.2中的功能和ALPN以便正确支持HTTP / 2,以及内部I / O处理以支持新的Servlet 3.1异步I / O功能集。

解决方案#1:

您无法在同一个VM中运行这两个版本而没有某种类加载器隔离,并且仔细配置以确保它们不会声明相同的资源(侦听端口,临时文件等) )

解决方案#2:

升级(或降级)一个或另一个火花依赖,直到你遇到一个普通的码头版本。 (Spark_2.11 / 2.0.0 seems to support Jetty 9.2.x

解决方案#3:

Apache Spark是开源的,请提交一个补丁,将其对Jetty的使用升级到9.3(这可能很难,因为Apache Spark还没有准备好使用Java 8,这是Jetty 9.3的要求)< / p>