2012-06-15 15 views
11

Ho 2 progetti usando Maven. Il primo è una libreria contenente classi e metodi di utilità. Il secondo progetto è un'applicazione reale che ha la libreria come dipendenza. La mia libreria utilizza internamente una libreria di terze parti.Limitare una dipendenza transitiva all'ambito runtime in Maven

Quindi queste sono le dipendenze:

  • Biblioteca personale: dipende dalla libreria di terze parti
  • La mia domanda: dipende dalla mia libreria

Comunque, io non voglio che il classi di libreria di terze parti disponibili al tempo di compilazione nella mia applicazione. Questo perché l'applicazione è supportata da un team di grandi dimensioni e voglio evitare che le persone utilizzino accidentalmente metodi della libreria di terze parti nell'applicazione, dato che alcuni nomi di classi e alcuni nomi di metodi sono simili tra i due. Naturalmente la libreria di terza parte dovrà essere disponibile nella mia domanda al runtime.

Se l'ambito per tutti i miei dipendenze era compilare, non sarebbe raggiungere il mio obiettivo. C'è un modo per ottenere questo in Maven 3?

risposta

16

Molto buona domanda e sfortunatamente non è possibile farlo utilizzando Maven 3, o 2, o qualsiasi altra versione, a causa del suo design fondamentale. Quello che stai chiedendo è in realtà un comportamento desiderato e ideale poiché in effetti le dipendenze compile di qualsiasi artefatto dovrebbero essere transitabili con lo scope runtime. Tuttavia, un design come questo porta ad alcuni problemi. Come si può leggere a Maven's Introduction to the Dependency Mechanism su compile portata:

Si è inteso che questa dovrebbe essere la portata di runtime, invece, in modo che tutti le dipendenze di compilazione devono essere elencati in modo esplicito - tuttavia, c'è il caso in cui la libreria si dipendono su estende una classe da un'altra libreria , forzandoti ad avere a disposizione in fase di compilazione. Per il motivo , le dipendenze del tempo di compilazione rimangono come ambito compilato anche quando sono transitive.

Quindi, come vedete, ciò che richiedete è in realtà la corretta progettazione di questo comportamento che è purtroppo impossibile da implementare.

+1

Speravo ci fosse un modo per farlo . Grazie per la tua risposta, Michal. – Juanal

+0

Questo è stato risposto anni fa. C'è un modo per farlo ora? Mi chiedo se potresti in qualche modo usare un ambito di importazione per hackerare una soluzione qui? –

+1

Non penso che nulla sia cambiato qui. Come ho detto nel 2012, il design Maven è fondamentale. Credo che ora non ci sia modo di cambiare questo dato che è proprio come Maven fa le cose fin dall'inizio. –

4

Nulla è cambiato negli ultimi tre anni, quindi la risposta di Michal è ancora corretta: non c'è modo di limitare la visibilità transitiva in Maven.

Tuttavia, si dovrebbe prendere in considerazione la riprogettazione della libreria per dividerla in un artefatto API che è necessario come dipendenza dal tempo di compilazione e che di per sé non dipende dalla libreria di terze parti e da un artefatto di implementazione che è necessario solo come dipendenza di runtime e che dipende dalla libreria di terze parti.

2

Nell'applicazione, è possibile dichiarare una dipendenza esplicita sulla libreria di terze parti utilizzando l'ambito "runtime".

Ciò impedisce la visualizzazione della raccolta di terze parti in fase di compilazione e pertanto non è possibile accedere ad altri usi diretti. Tuttavia, sarà comunque presente in fase di runtime (poiché è necessaria per la libreria).

Questo funziona, ma è scomodo e merita un commento XML esplicativo nel pom.

0

Le altre risposte sono corrette. Oltre a lavorare attorno attorno una caratteristica fondamentale mancante nella maven suddividendo un modulo solo API artificiale, si hanno anche i seguenti alternative:

  • escludono le dipendenze transitive, poi dipenderà direttamente (è necessario gestire i numeri di versione te stesso)
  • Usa controllo di importazione stile check e CI. In questo modo i membri del team possono utilizzare i transitives, ma in tal caso la verifica di Maven fallirà
  • Usa gradle. Si tratta di una soluzione a molte limitazioni di Maven
Problemi correlati