在我的项目中,我被迫使用这些包:
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)然后它会遮住它,所以它会解决它真的没有帮助。
答案 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>