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). J'ai donc 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 le dossier Java -cp lib\*.jar -jar myproject.jar
À partir du dossier C:\xyz
, Mais l'erreur suivante est générée.
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
), Le problème disparaîtra, mais je ne veux pas le faire, car j'ai déjà 40 bibliothèques et il pourrait s'agrandir dans les prochaines versions. 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 le moyen le plus simple d'y parvenir.
Vous pouvez utiliser le appassembler-maven-plugin à ces fins.
Vous ne pouvez pas utiliser les deux -jar
et -cp
sur la ligne de commande - voir la documentation Java) qui dit que si vous utilisez -jar
:
le fichier JAR est la source de toutes les classes d'utilisateurs et les autres paramètres de chemin d'accès aux classes d'utilisateurs sont ignorés.
Vous pouvez faire quelque chose comme ça:
Java -cp lib\*.jar;. myproject.MainClass
Remarquez le ;.
dans le -cp
argument, pour contourner un bogue de ligne de commande Java. Veuillez également noter qu'il s'agit de la version Windows de la commande. Le séparateur de chemin d'accès sur Unix est :
.
Utilisation de 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
Quel que soit le système d'exploitation, la commande ci-dessous devrait fonctionner:
Java -cp "MyJar.jar;lib/*" com.mainClass
Utilisez toujours des guillemets et veuillez noter que lib/*. Jar ne fonctionnera pas.
Vous pouvez utiliser maven-Assembly-plugin, voici l'exemple du site officiel: https://maven.Apache.org/plugins/maven-Assembly-plugin/usage.html
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>your main class</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-Assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
une solution possible pourrait être
créer un fichier batch
il fait une boucle sur le répertoire lib pour tous les fichiers qu'il contient et définit chaque fichier unside lib sur classpath
puis après cela lance le pot
source pour la boucle dans un fichier batch pour plus d'informations sur les boucles
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 de plugin Assembly .
Enfin, vous pouvez générer un fichier contenant le chemin de classe en utilisant le fichier dependency:classpath
objectif.
Je rencontrais le même problème, mais je pouvais intégrer toutes les dépendances dans mon fichier jar en utilisant le plug-in Maven Shade