Gradle 中传递依赖的不同版本
Different versions in transitive dependencies in Gradle
在我的项目中,我不得不使用这些包:
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.sparkjava
和org.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)然后它隐藏了它,所以它是真的没有帮助。
要解决这种情况会非常困难。
Jetty 8.1 比 Jetty 9.3 落后大约 4 个主要版本,这代表了数百个版本的差异。
Note: Jetty versioning is [servlet_support].[major_ver].[minor_ver].
Jetty 8.x is Servlet 3.0, while Jetty 9.x is 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 依赖项,直到您找到通用的码头版本。 (Spark_2.11 / 2.0.0 seems to support Jetty 9.2.x)
解决方案 #3:
Apache Spark 是开源的,请提交一个补丁,将其对 Jetty 的使用升级到 9.3(这可能很难,因为 Apache Spark 还没有准备好使用 Java 8,这是码头 9.3)
在我的项目中,我不得不使用这些包:
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.sparkjava
和org.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)然后它隐藏了它,所以它是真的没有帮助。
要解决这种情况会非常困难。
Jetty 8.1 比 Jetty 9.3 落后大约 4 个主要版本,这代表了数百个版本的差异。
Note: Jetty versioning is [servlet_support].[major_ver].[minor_ver].
Jetty 8.x is Servlet 3.0, while Jetty 9.x is 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 依赖项,直到您找到通用的码头版本。 (Spark_2.11 / 2.0.0 seems to support Jetty 9.2.x)
解决方案 #3:
Apache Spark 是开源的,请提交一个补丁,将其对 Jetty 的使用升级到 9.3(这可能很难,因为 Apache Spark 还没有准备好使用 Java 8,这是码头 9.3)