2016-08-01 39 views
0

In meinem Projekt ich diese Pakete verwenden gezwungen:Verschiedene Versionen in transitive Abhängigkeiten in Gradle

  • com.sparkjava:spark-core:2.3, die jetty-server:9.3.2.v20150730
  • org.apache.spark:spark-core_2.10:1.2.0 mit endet, die mit endet jetty-server:8.1.14.v20131031

Beachten Sie, dass com.sparkjava und org.apache.spark nichts miteinander zu tun haben. Sie heißen beide Funken komisch.

Das Problem hier ist, dass beide Anlegesteg Versionen nicht kompatibel sind, so dass, wenn ich jetty 8.X die Systemabstürze zu erzwingen, wenn ich jetty 9.X das System zwingen, stürzt wieder, bekomme ich java.lang.NoClassDefFoundError: org/eclipse/jetty/server/ServerConnector in einem Fall und java.lang.NoClassDefFoundError: org/eclipse/jetty/server/bio/SocketConnector in der anderen.

Was soll ich in einer solchen Situation tun?

Hinweis: Ich habe versucht, Jetty zu schattieren, aber der Dependency Manager löst nur einen (9.X standardmäßig, oder 8.X, wenn ich es erzwinge) und dann Schatten, so dass es wirklich nicht hilft.

Antwort

1

Es wäre äußerst schwierig, diese Situation zu lösen.

Jetty 8.1 ist etwa 4 Hauptversion hinter Jetty 9.3, die viele hundert Releases Unterschied darstellt.

Hinweis: Jetty Versionierung ist [servlet_support]. [Major_ver]. [Minor_ver].

Jetty 8.x ist Servlet 3.0, während Jetty 9.x ist Servlets 3,1

Die Architektur der Anschlüsse enorm in diesem Zeitrahmen entwickelt hat, von der alten Schule ist Sockets in Jetty 8 bis keine Blockierung In Jetty 9 werden überhaupt Connectors blockiert, wobei Jetty 9 die Konnektoren zur Unterstützung von Features in TLS/1.2 und ALPN weiterentwickeln muss, um HTTP/2 richtig zu unterstützen, und die interne I/O-Behandlung das neue Servlet 3.1 Async I unterstützt/O Funktionssatz.

Lösung # 1:

Sie werden nicht in der Lage sein, beide Versionen haben, ohne irgendeine Art von Klassenlader Isolation in der gleichen VM ausgeführt wird, und eine sorgfältige Konfiguration zu gewährleisten, dass sie die gleichen Ressourcen nicht behaupten (hören Ports , temporäre Dateien usw.)

Lösung # 2:

Upgrade (oder Herabstufung) die eine oder andere Funken Abhängigkeit, bis Sie treffen eine gemeinsame Anlegestelle Version. (Spark_2.11/2.0.0 seems to support Jetty 9.2.x)

Lösung # 3:

Apache Spark ist Open Source, gehen einen Patch einreichen, die die Verwendung von Jetty auf 9,3 Upgrades (dies schwierig sein könnte, wie Apache Spark nicht bereit ist, Java verwenden 8 noch , das ist eine Voraussetzung für Jetty 9.3)

+0

Danke, sieht aus, als ob ich in ein bisschen Ärger dann bin. Ich werde sparkjava dann loswerden. – Marc

+0

Nur für die Aufzeichnung. Ich habe den Code entfernt, der 'sparkjava' verwendet und die andere Netty-Version in build.gradle über das Schatten-Plugin erzwungen. – Marc