Java Language Créer un UberJAR pour une application et ses dépendances


Exemple

Une exigence commune pour une application Java est qu’elle peut être déployée en copiant un seul fichier. Pour les applications simples qui ne dépendent que des bibliothèques de classes Java SE standard, cette exigence est satisfaite en créant un fichier JAR contenant toutes les classes d'applications (compilées).

Les choses ne sont pas si simples si l'application dépend de bibliothèques tierces. Si vous placez simplement des fichiers JAR de dépendance dans un JAR d'application, le chargeur de classe Java standard ne pourra pas trouver les classes de bibliothèque et votre application ne démarrera pas. Au lieu de cela, vous devez créer un fichier JAR unique contenant les classes d'application et les ressources associées avec les classes et les ressources de dépendance. Celles-ci doivent être organisées en un seul espace de noms pour le chargeur de classe.

Un tel fichier JAR est souvent appelé UberJAR.

Créer un UberJAR en utilisant la commande "jar"

La procédure de création d'un UberJAR est simple. (J'utiliserai les commandes Linux pour plus de simplicité. Les commandes doivent être identiques pour Mac OS et similaires pour Windows.)

  1. Créez un répertoire temporaire et modifiez-le.

    $ mkdir tempDir
    $ cd tempDir
    
  2. Pour chaque fichier JAR dépendant, dans l'ordre inverse où ils doivent apparaître dans le chemin de classe de l'application, utilisez la commande jar pour décompresser le fichier JAR dans le répertoire temporaire.

    $ jar -xf <path/to/file.jar>
    

    Faire cela pour plusieurs fichiers JAR superposera le contenu des fichiers JAR.

  3. Copiez les classes d'application de l'arborescence de construction dans le répertoire temporaire

    $ cp -r path/to/classes .
    
  4. Créez le UberJAR à partir du contenu du répertoire temporaire:

    $ jar -cf ../myApplication.jar
    

    Si vous créez un fichier JAR exécutable, incluez un fichier MANIFEST.MF approprié, comme décrit ici.

Création d'un UberJAR à l'aide de Maven

Si votre projet est construit avec Maven, vous pouvez le faire pour créer un UberJAR en utilisant les plugins "maven-assembly" ou "maven-shade". Voir la rubrique Maven Assembly (dans la documentation Maven ) pour plus de détails.

Les avantages et inconvénients des UberJAR

Certains avantages des UberJAR sont évidents:

  • Un UberJAR est facile à distribuer.
  • Vous ne pouvez pas casser les dépendances de bibliothèque pour un UberJAR, car les bibliothèques sont autonomes.

De plus, si vous utilisez un outil approprié pour créer UberJAR, vous aurez la possibilité d'exclure les classes de bibliothèque qui ne sont pas utilisées à partir du fichier JAR. Cependant, cela se fait généralement par une analyse statique des classes. Si votre application utilise la réflexion, le traitement des annotations et des techniques similaires, vous devez faire attention à ce que les classes ne soient pas exclues de manière incorrecte.

Les UberJAR présentent également certains inconvénients:

  • Si vous avez beaucoup de UberJAR avec les mêmes dépendances, chacune contiendra une copie des dépendances.
  • Certaines bibliothèques open source ont des licences qui peuvent empêcher 1 leur utilisation dans un UberJAR.

1 - Certaines licences de bibliothèque open source vous permettent d’utiliser uniquement la bibliothèque de l’utilisateur final qui peut remplacer une version de la bibliothèque par une autre. Les UberJAR peuvent rendre difficile le remplacement des dépendances de version.