2015-06-10 4 views
6

Ich versuche, einen Dropwizard (Jersey) REST-Endpunkt zu erstellen, der mit HBase kommuniziert. Obwohl dies meine einzigen beiden Abhängigkeiten auf oberster Ebene sind, werden beide Abhängigkeiten mit vielen transitiven Abhängigkeiten geladen, die einen Konflikt verursachen. Ein einfaches Beispiel für einen solchen Konflikt ist Guava Google:Auflösen von transitiven Abhängigkeitskonflikten in Java

  • Die HBase Client gibt Version 11
  • Dropwizard 18 gibt

Dropwizard nicht 11 mit Version arbeiten und HBase nicht mit Version 18 arbeiten .

Ich habe die Maven Schatten Plugin-Dokumentation untersucht, aber es scheint nicht zu erlauben, Sie Klassen in Abhängigkeitsgläsern zu verlagern. Ich weiß also nicht, wie ich dieses Problem lösen kann, ohne diese beiden Komponenten in separate JVMs aufzuteilen.

+0

Können Sie mehr Details darüber geben, warum nicht jeder mit einer verbesserten/herabgestuften Version von Guava laufen kann? –

+0

Die Konflikte waren sehr vielfältig, aber eine, die mich umbrachte, war 'com.google.common.base.Stopwatch', wobei zwischen den Versionen 17 und 18 die API ohne jegliche Form der Entwertung geändert wurde. –

+0

Keine Chance, HBase zu verzweigen und die Abhängigkeit zu erhöhen ? –

Antwort

1

Dies ist eine schmutzige Lösung. Aber Sie könnten ...

Erstellen Sie ein Projekt/Modul, wo Sie eine Reihe von Service-Schnittstellen definieren, die Ihre Dropwizard-App verwenden wird, um mit HBase zu sprechen.

Erstellen Sie ein anderes Modul/Projekt, das diese Schnittstellen implementiert und die HBase-Klassen verwendet. Shade dieses Projekt.

In Ihrem Dropwizard-Projekt enthalten Sie nur das Interface jar, aber erstellen Sie eine Aufgabe, um das schattierte Artefakt in Ihre Ressourcen zu kopieren.

Erstellen Sie einen JARClassLoader für Ihr schattiertes HBase-Client-Artefakt. Möglicherweise müssen Sie eine spezielle Unterklasse erstellen, die nicht an das übergeordnete Element delegiert. Standardmäßig fordert der Klassenlader das übergeordnete Element auf, Verknüpfungen zu lösen, und kann die neuere Version von guava aus dem äußeren Klassenlader abrufen.

für eine Instanz des Dienstvertrags Fragen aus dem Jar loader ...

Businessing api = Class.forName("com.awesome.Businessing", true, jarLoader).newInstance();

0

Versuchen in <dependencyManagement/> Abschnitt konkrete Versionen für diese Abhängigkeiten angeben, von Ihnen pom.xml.