Uber JAR, in breve, è un JAR che contiene tutto.
Normalmente a Maven, facciamo affidamento sulla gestione delle dipendenze. Un artefatto contiene solo le classi / risorse di se stesso. Maven sarà responsabile di scoprire tutti gli artefatti (JAR ecc.) Che il progetto dipende da quando il progetto è stato costruito.
Un uber-jar è qualcosa che prende tutte le dipendenze, estrae il contenuto delle dipendenze e le mette con le classi / risorse del progetto stesso, in un unico grande JAR. Avere un tale super-jar, è facile per l'esecuzione, perché avrai bisogno di un solo JAR grande invece di tonnellate di piccoli JAR per eseguire la tua app. In alcuni casi facilita anche la distribuzione.
Solo una nota a margine. Evita di usare uber-jar come dipendenza di Maven, poiché sta rovinando la funzione di risoluzione delle dipendenze di Maven. Normalmente creiamo uber-jar solo per l'artefatto finale per la distribuzione effettiva o per la distribuzione manuale, ma non per il repository Maven.
Aggiornamento: ho appena scoperto di non aver risposto a una parte della domanda: "Qual è lo scopo di rinominare i pacchetti delle dipendenze?". Ecco alcuni brevi aggiornamenti e, si spera, aiuteranno le persone con domande simili.
La creazione di uber-jar per facilitare la distribuzione è un caso d'uso del plugin ombra. Esistono anche altri casi d'uso comuni che comportano la ridenominazione dei pacchetti.
Ad esempio, sto sviluppando una Foo
libreria, che dipende da una versione specifica (ad es. 1.0) della Bar
libreria. Supponendo che non sia possibile utilizzare altre versioni di Bar
lib (a causa della modifica dell'API o di altri problemi tecnici, ecc.). Se io dichiaro semplicemente Bar:1.0
come Foo
's dipendenza nel Maven, è possibile cadere in un problema: un Qux
progetto è in funzione Foo
, e anche Bar:2.0
(e non si può usare Bar:1.0
, perché Qux
ha bisogno di usare nuova funzione Bar:2.0
). Ecco il dilemma: dovrebbe Qux
usare Bar:1.0
(quale Qux
codice non funzionerà) o Bar:2.0
(quale Foo
codice non funzionerà)?
Per risolvere questo problema, lo sviluppatore di Foo
può scegliere di utilizzare il plugin ombra per rinominarne l'utilizzo Bar
, in modo che tutte le classi in Bar:1.0
jar siano incorporate in Foo
jar e il pacchetto delle Bar
classi incorporate venga modificato da com.bar
a com.foo.bar
. In questo modo, Qux
può tranquillamente dipendere dal Bar:2.0
fatto che ora Foo
non dipende più da Bar
e sta usando la propria copia di "alterato" che si Bar
trova in un altro pacchetto.