2015-06-10 15 views
6

Próbuję zbudować punkt końcowy REST o wartości Dropwizard (Jersey), który komunikuje się z HBase. Chociaż są to moje jedyne dwie główne zależności, obie te zależności są obciążone wieloma zależnymi od siebie przechodnimi zależnościami. Prostym przykładem takiego konfliktu jest Google'a Guava:Rozwiązywanie konfliktów zależności przechodnich w Javie

  • Klient HBase określa wersja 11
  • Dropwizard określa 18

Dropwizard nie będzie działać z wersją 11 a HBase nie będzie działać z wersją 18

Przeanalizowałem dokumentację wtyczki Mavena, ale wydaje się, że nie pozwala ona na przeniesienie klas znalezionych w słoikach zależności. Tak więc nie wiem, jak rozwiązać ten problem, nie dzieląc tych dwóch komponentów na osobne maszyny JVM.

+0

Czy możesz podać więcej szczegółów, dlaczego nie można ich używać z ulepszoną/obniżoną wersją guawy? –

+0

Konflikty należały do ​​wielu, ale jeden z nich, który mnie zabił, to: com.google.common.base.Stopwatch', gdzie między wersjami 17 i 18 interfejs API zmienił się bez jakiejkolwiek formy wycofania. –

+0

Brak szans na rozwidlenie HBase i aktualizację zależności ? –

Odpowiedz

1

To jest brudne rozwiązanie. Ale możesz ...

Utwórz projekt/moduł, w którym zdefiniujesz zestaw interfejsów serwisowych, których Twoja aplikacja Dropwizard będzie używać do rozmawiania z HBase.

Utwórz kolejny moduł/projekt, który implementuje te interfejsy i korzysta z klas HBase. Cień tego projektu.

W projekcie Dropwizard uwzględnij tylko słoik interfejsu, ale stwórz zadanie, aby skopiować zacieniony artefakt do swoich zasobów.

Utwórz obiekt JARClassLoader dla zacienionego artefaktu klienta HBase. Być może będziesz musiał utworzyć specjalną podklasę, która nie deleguje do rodzica, ponieważ domyślnie program ładujący klasy poprosi rodzica o rozwiązanie powiązań i może pobrać nowszą wersję guavy z zewnętrznego programu ładującego klasy.

Zapytaj na przykład umowy o świadczenie usług z ładowaczem Jar ...

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

0

Spróbuj określić konkretne wersje tych zależności w <dependencyManagement/> części z was pom.xml.

Powiązane problemy