web-dev-qa-db-fra.com

Exécutez un fichier JAR à partir de la ligne de commande et spécifiez le chemin d'accès aux classes.

J'ai compilé un fichier JAR et spécifié la classe principale dans le manifeste (j'ai utilisé la fonction Eclipse Export ) Mes dépendances se trouvent toutes dans un répertoire intitulé lib. Je n'arrive pas à obtenir une réponse claire sur la façon d'exécuter mon fichier JAR en spécifiant qu'il devrait utiliser le lib/* comme chemin de classe.

J'ai essayé:

]$ Java -jar -cp .:lib/* MyJar.jar
]$ Java -cp .:lib/* -jar MyJar.jar
]$ Java -cp .:lib/* com.somepackage.subpackage.Main

etc...

Chacun donne une erreur en disant:

Error: Could not find or load main class ....

ou donne le NoClassDefFoundError indiquant que les bibliothèques ne sont pas trouvées.

J'ai même essayé de refaire le fichier JAR et inclus le répertoire lib et son contenu, mais toujours pas de dés ...

Comment puis-je exécuter un fichier JAR à partir de la ligne de commande et spécifier le chemin d'accès aux classes à utiliser?

102
SnakeDoc

Lorsque vous spécifiez -jar, le paramètre -cp sera ignoré.

De la documentation :

Lorsque vous utilisez cette option, 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 ne pouvez pas non plus "inclure" les fichiers JAR nécessaires dans un autre fichier JAR (vous devrez extraire leur contenu et placer les fichiers .class dans votre fichier JAR).

Vous avez deux options:

  1. inclure tous les fichiers jar du répertoire lib dans le manifeste (vous pouvez y utiliser des chemins relatifs)
  2. Spécifiez tout (, y compris votre fichier jar) sur la ligne de commande à l'aide de -cp:
    Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
176

Exécutez un fichier jar et spécifiez un chemin de classe comme ceci:

Java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar est le nom complet du fichier JAR que vous souhaitez exécuter.

libs/* est un chemin d'accès à vos fichiers JAR de dépendance.

com.test.App est le nom complet de la classe du fichier JAR associé à la méthode main(String[]).

Le jar et le jar dépendant doivent avoir des autorisations d'exécution.

30
Sid

Vous pouvez faire ceci dans unix Shell:

Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Vous pouvez faire ceci dans windows powershell:

Java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
6
tars

Vous pouvez également utiliser le manifeste pour spécifier le chemin de classe et la classe principale si vous le souhaitez. Vous n'avez donc pas besoin d'utiliser -cp ni de spécifier la classe principale. Dans votre cas, cela contiendrait des lignes comme ceci:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

Malheureusement, vous devez épeler chaque fichier jar dans le manifeste (pas un gros problème comme vous ne le faites une fois, et vous pouvez utiliser un script pour créer le fichier ou utiliser un outil de construction comme ANT ou Maven ou Gradle). Et la référence doit être un répertoire relatif ou absolu vers lequel vous exécutez le Java -jar MyJar.jar.

Puis exécutez-le avec

Java -jar MyJar.jar
4
HankCa