Uber JAR, en bref, est un JAR contenant tout.
Normalement, à Maven, nous comptons sur la gestion des dépendances. Un artefact ne contient que les classes / ressources de lui-même. Maven sera responsable de découvrir tous les artefacts (JAR, etc.) du projet en fonction de la date de construction du projet.
Un uber-jar est quelque chose qui prend toutes les dépendances, extrait le contenu des dépendances et les met avec les classes / ressources du projet lui-même, dans un grand JAR. En ayant un tel uber-jar, il est facile à exécuter, car vous aurez besoin d'un seul grand JAR au lieu de tonnes de petits JAR pour exécuter votre application. Il facilite également la distribution dans certains cas.
Juste une petite note. Évitez d'utiliser uber-jar comme dépendance Maven, car cela ruine la fonctionnalité de résolution des dépendances de Maven. Normalement, nous créons uber-jar uniquement pour l'artefact final pour un déploiement réel ou pour une distribution manuelle, mais pas pour le placement dans le référentiel Maven.
Mise à jour: Je viens de découvrir que je n'ai pas répondu à une partie de la question: "Quel est l'intérêt de renommer les packages des dépendances?". Voici quelques brèves mises à jour et, espérons-le, aideront les personnes ayant une question similaire.
Créer un uber-jar pour faciliter le déploiement est un cas d'utilisation du plugin d'ombre. Il existe également d'autres cas d'utilisation courants qui impliquent un changement de nom de package.
Par exemple, je développe une Foo
bibliothèque, qui dépend d'une version spécifique (par exemple 1.0) de la Bar
bibliothèque. En supposant que je ne peux pas utiliser une autre version de Bar
lib (en raison d'un changement d'API ou d'autres problèmes techniques, etc.). Si je déclare simplement Bar:1.0
que Foo
la dépendance « dans Maven, il est possible de tomber dans un problème: un Qux
projet dépend de Foo
, et aussi Bar:2.0
(et il ne peut pas utiliser Bar:1.0
parce que les Qux
besoins d'utiliser nouvelle fonctionnalité Bar:2.0
). Voici le dilemme: devrait Qux
utiliser Bar:1.0
(quel Qux
code ne fonctionnera pas) ou Bar:2.0
(quel Foo
code ne fonctionnera pas)?
Afin de résoudre ce problème, le développeur de Foo
peut choisir d'utiliser le plugin d'ombre pour renommer son utilisation Bar
, de sorte que toutes les classes dans Bar:1.0
jar soient incorporées dans Foo
jar et que le package des Bar
classes incorporées soit changé de com.bar
en com.foo.bar
. Ce faisant, Qux
peut dépendre en toute sécurité Bar:2.0
car maintenant Foo
ne dépend plus de Bar
, et il utilise sa propre copie de "altéré" Bar
situé dans un autre package.