2015-06-10 15 views
6

Sto provando a creare un endpoint REST Dropwizard (Jersey) che comunica con HBase. Sebbene queste siano le mie uniche due dipendenze di primo livello, entrambe queste dipendenze vengono caricate con molte dipendenze transitive in conflitto. Un semplice esempio di tale conflitto è Guava di Google:Risoluzione dei conflitti di dipendenza transitiva in Java

  • Il cliente HBase specifica versione 11
  • Dropwizard specifica 18

Dropwizard non funziona con la versione 11 e HBase non funziona con la versione 18

Ho esaminato la documentazione del plugin schermo Maven, ma non sembra consentirvi di riposizionare le classi trovate nei barattoli delle dipendenze. Quindi non so come risolvere questo problema per separare questi due componenti in JVM separate.

+0

Puoi fornire maggiori dettagli sul perché ognuno non può essere eseguito con una versione aggiornata/downgrade di guava? –

+0

I conflitti erano molti, ma uno che mi ha ucciso era 'com.google.common.base.Stopwatch', dove tra le versioni 17 e 18 l'API è cambiata senza alcuna forma di deprecazione –

+0

Nessuna possibilità di bifare HBase e l'aggiornamento della dipendenza ? –

risposta

1

Questa è una soluzione sporca. Ma potresti ...

Creare un progetto/modulo in cui si definisce un insieme di interfacce di servizio che l'applicazione dropwizard utilizzerà per comunicare con HBase.

Creare un altro modulo/progetto che implementa queste interfacce e utilizza le classi HBase. Ombreggia questo progetto

Nel progetto Dropwizard include solo il jar dell'interfaccia, ma crea un'attività per copiare l'artefatto ombreggiato nelle risorse.

Creare un JARClassLoader per l'artefatto client HBase ombreggiato. Potrebbe essere necessario creare una sottoclasse speciale che non deleghi al genitore poiché per impostazione predefinita il classloader chiederà al genitore di risolvere i collegamenti e potrebbe estrarre la versione più recente di guava dal classloader esterno.

Chiedi per un'istanza del contratto di servizio dal caricatore Jar ...

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

0

tenta di specificare le versioni concrete per tali dipendenze in <dependencyManagement/> sezione si pom.xml.

Problemi correlati