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?
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:
lib
dans le manifeste (vous pouvez y utiliser des chemins relatifs)-cp
:Java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
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.
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
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