1

In my project I am forced to use these packages:

  • com.sparkjava:spark-core:2.3, which ends up using jetty-server:9.3.2.v20150730
  • org.apache.spark:spark-core_2.10:1.2.0, which ends up using jetty-server:8.1.14.v20131031

Note that com.sparkjava and org.apache.spark have nothing to do with each other. They are called both spark funnily.

The issue here is that both jetty versions are incompatible, so if I force jetty 8.X the system crashes, if I force jetty 9.X the system crashes again, I get java.lang.NoClassDefFoundError: org/eclipse/jetty/server/ServerConnector in one case and java.lang.NoClassDefFoundError: org/eclipse/jetty/server/bio/SocketConnector in the other.

What I am expected to do in such a situation ?

Note: I've tried to shadow jetty, but the dependency manager resolves just one (9.X by default, or 8.X if I force it) and then it shadows it, so it's really not helping.

4

1 回答 1

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 Async I/O 功能集。

解决方案#1:

如果没有某种类加载器隔离和仔细配置以确保它们不会占用相同的资源(侦听端口、临时文件等),您将无法让两个版本在同一 VM 中运行

解决方案#2:

升级(或降级)一个或另一个 spark 依赖项,直到你达到一个通用的 jetty 版本。( Spark_2.11 / 2.0.0 似乎支持 Jetty 9.2.x )

解决方案#3:

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

于 2016-08-01T13:07:28.517 回答