Exécutez le fichier JAR avec plusieurs bibliothèques de classpath à partir de l’invite de commandes

J’ai un projet Maven qui génère un fichier jar et copie toutes les dépendances dans le dossier target/lib . Je veux exécuter ce projet sur la machine du client (windows). Donc, j’ai copié myproject.jar dans le dossier C:\xyz et toutes les dépendances dans le dossier C:\xyz\lib . Comment puis-je exécuter ce projet à partir de l’invite de commande du client? J’ai essayé d’utiliser java -cp lib\*.jar -jar myproject.jar depuis le dossier C:\xyz , mais il génère l’erreur suivante.

 Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: lib\commons-codec-1.3.jar. Program will exit. 

Je pense que si je spécifie toutes les dépendances dans classpath (comme java -cp lib\dep1.jar;dep2.jar ), cela éliminera le problème mais je ne veux pas le faire car j’ai déjà 40 bibliothèques et cela pourrait croître dans les versions futures. Y a-t-il une meilleure manière de faire cela?

Laissez maven générer un fichier de commandes pour démarrer votre application. C’est la façon la plus simple d’y parvenir.

Vous pouvez utiliser le plugin appassembler-maven à ces fins.

Vous ne pouvez pas utiliser à la fois -jar et -cp sur la ligne de commande – voir la documentation de Java qui dit que si vous utilisez -jar :

le fichier JAR est la source de toutes les classes d’utilisateurs et les autres parameters de chemin d’access de classe d’utilisateurs sont ignorés.

Vous pourriez faire quelque chose comme ça:

java -cp lib\*.jar;. myproject.MainClass

Notez le ;. dans l’argument -cp , contourner un bogue de ligne de commande Java. Notez également qu’il s’agit de la version Windows de la commande. Le séparateur de chemin sur Unix est:.

Utiliser java 1.7, sous UNIX –

 java -cp myjar.jar:lib/*:. mypackage.MyClass 

Sous Windows, vous devez utiliser ‘;’ au lieu de ‘:’ –

 java -cp myjar.jar;lib/*;. mypackage.MyClass 

une solution possible pourrait être

créer un fichier de commandes

il y a une boucle sur le répertoire lib pour tous les fichiers qu’il contient et pour chaque fichier unside lib sur classpath

puis après que courir le pot

source pour la boucle dans le fichier de commandes pour les informations sur les boucles

Vous pouvez utiliser maven-assembly-plugin, voici l’exemple du site officiel: https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

   org.apache.maven.plugins maven-assembly-plugin 2.5.1   jar-with-dependencies    your main class      make-assembly  package   single     

Il y a plusieurs options.

Le plus simple est probablement le plugin exec .

Vous pouvez également générer un fichier jar contenant toutes les dépendances à l’aide du plugin assembly .

Enfin, vous pouvez générer un fichier avec le classpath en utilisant l’objective dependency:classpath .

J’étais en train de rencontrer le même problème, mais j’ai pu regrouper toutes les dépendances dans mon fichier jar à l’aide du plugin Maven Shade.

Cela ne fonctionnera pas java -cp lib\*.jar -jar myproject.jar . Vous devez le mettre en pot.

Donc, en cas de commons-codec-1.3.jar .

java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar et ainsi de suite.

L’autre solution pourrait consister à placer tous vos fichiers ext répertoire ext de votre environnement JRE. Ceci est correct si vous utilisez un JRE autonome. Si vous utilisez le même JRE pour exécuter plusieurs applications, je ne vous le recommande pas .