web-dev-qa-db-fra.com

Exécutez le fichier jar avec plusieurs bibliothèques de chemins de classe à partir de l'invite de commande

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?

53
Praneeth

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.

15
khmarbaise

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 :.

63
Sualeh Fatehi

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
50
jamp

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.

4
Hari

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>
3
lbsweek

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

2
Mukul Goel

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.

1
Dave Newton

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

1
fjxx