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 Foobibliothèque, qui dépend d'une version spécifique (par exemple 1.0) de la Barbibliothèque. En supposant que je ne peux pas utiliser une autre version de Barlib (en raison d'un changement d'API ou d'autres problèmes techniques, etc.). Si je déclare simplement Bar:1.0que Foola dépendance « dans Maven, il est possible de tomber dans un problème: un Quxprojet dépend de Foo, et aussi Bar:2.0(et il ne peut pas utiliser Bar:1.0parce que les Quxbesoins d'utiliser nouvelle fonctionnalité Bar:2.0). Voici le dilemme: devrait Quxutiliser Bar:1.0(quel Quxcode ne fonctionnera pas) ou Bar:2.0(quel Foocode ne fonctionnera pas)?
Afin de résoudre ce problème, le développeur de Foopeut choisir d'utiliser le plugin d'ombre pour renommer son utilisation Bar, de sorte que toutes les classes dans Bar:1.0jar soient incorporées dans Foojar et que le package des Barclasses incorporées soit changé de com.baren com.foo.bar. Ce faisant, Quxpeut dépendre en toute sécurité Bar:2.0car maintenant Foone dépend plus de Bar, et il utilise sa propre copie de "altéré" Barsitué dans un autre package.