Est-il possible de créer un jar «uber» contenant les classes de projet et les dépendances du projet en tant que jars avec un fichier manifeste personnalisé?

J’essaie de créer un fichier jar exécutable (à l’aide de maven) contenant les classes du projet et ses dépendances avec un fichier manifeste contenant l’entrée de la classe principale et l’entrée du chemin de classe qui pointe vers les dépendances compressées à la racine du fichier jar. ;quelque chose comme ça :

Fichier manifeste:

 .....
 Classe principale: com.acme.MainClass
 Chemin de la classe: dependecy1.jar dependecy2.jar
 .....

Pot:

 pot-racine
 | - ....
 | - com / acme /../*. class
 | - dependecy1.jar
 `- dependecy2.jar

J’utilise le plugin maven-jar-plugin pour créer le fichier manifeste et le plugin maven-shade-plugin pour créer le fichier jar “uber”, mais les dépendances sont décompressées et ajoutées en tant que classes à mon fichier jar.

En fait, je n’ai pas vérifié ce que fait exactement le maven-shade-plugin (ni aucun autre plugin), car maven 2 a tout ce qu’il faut pour créer un mégajar ou un uberjar. Il vous suffit d’utiliser le plugin maven-assembly-plugin avec le descripteur prédéfini jar-with-dependencies .

Ajoutez simplement cet extrait à votre pom.xml pour personnaliser le manifeste:

  org.apache.maven.plugins maven-assembly-plugin    my.package.to.my.MainClass     

Et la commande suivante générera votre uberjar:

 mvn assembly:assembly -DdescriptorId=jar-with-dependencies 

Mais, encore une fois, le comportement par défaut de ce descripteur est de décompresser les dépendances (comme le plugin maven-shade-plugin). Pour être honnête, je ne comprends pas pourquoi c’est un problème, mais si ce n’est vraiment pas ce que vous voulez, vous pouvez utiliser votre propre descripteur d’assemblage personnalisé.

Pour ce faire, créez d’abord votre descripteur d’assemblage, disons src/assembly/uberjar.xml , avec le contenu suivant:

  uberjar  jar  false   false runtime false     ${project.build.outputDirectory} /    

Ensuite, configurez le plug-in maven-assembly pour utiliser ce descripteur et pour append les dépendances à l’entrée Class-Path du manifeste:

  org.apache.maven.plugins maven-assembly-plugin   src/assembly/uberjar.xml    my.package.to.my.MainClass true      

Enfin, exécutez mvn assembly:assembly pour produire votre uberjar.

Si vous le souhaitez, supprimez la mise en commentaire de l’élément executions pour lier le plug-in d’assembly lors de la phase de package (et l’assemblage sera produit dans le cadre de la construction normale).

OneJar a un plugin maven2 .

J’ai utilisé FatJar pour cela par le passé. http://fjep.sourceforge.net/

J’avais créé une application relativement simple, le client voulait double-cliquer sur un exécutable et le faire fonctionner. Les installateurs ou les dépendances sont hors de question. Fatjar a regroupé les bibliothèques de projet et les fichiers référencés d’Eclipse dans un fichier jar exécutable de plusieurs mégaoctets pour moi. Sans défaut.

Je connais deux produits qui font ceci:

  • L’un s’appelle «bigjar», mais c’est un terme trop général pour être utile dans une recherche Google; Je n’ai pas pu le trouver.
  • L’autre s’appelle “onejar”. Il y a pas mal de références à cela, et il prétend faire ce dont vous avez besoin.

Voici un post de quelqu’un qui utilise OneJar dans une assemblée Maven:

http://5341.com/list/55/498657.html