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 Foolibreria, che dipende da una versione specifica (ad es. 1.0) della Barlibreria. Supponendo che non sia possibile utilizzare altre versioni di Barlib (a causa della modifica dell'API o di altri problemi tecnici, ecc.). Se io dichiaro semplicemente Bar:1.0come Foo's dipendenza nel Maven, è possibile cadere in un problema: un Quxprogetto è in funzione Foo, e anche Bar:2.0(e non si può usare Bar:1.0, perché Quxha bisogno di usare nuova funzione Bar:2.0). Ecco il dilemma: dovrebbe Quxusare Bar:1.0(quale Quxcodice non funzionerà) o Bar:2.0(quale Foocodice non funzionerà)?
Per risolvere questo problema, lo sviluppatore di Foopuò scegliere di utilizzare il plugin ombra per rinominarne l'utilizzo Bar, in modo che tutte le classi in Bar:1.0jar siano incorporate in Foojar e il pacchetto delle Barclassi incorporate venga modificato da com.bara com.foo.bar. In questo modo, Quxpuò tranquillamente dipendere dal Bar:2.0fatto che ora Foonon dipende più da Bare sta usando la propria copia di "alterato" che si Bartrova in un altro pacchetto.