Exécutez un fichier JAR à partir de la ligne de commande et spécifiez le chemin de classe

115

J'ai compilé un fichier JAR et spécifié la classe principale dans le manifeste (j'ai utilisé la fonction d' exportation Eclipse ). Mes dépendances sont toutes dans un répertoire étiqueté lib. Je n'arrive pas à obtenir une réponse claire sur la façon d'exécuter mon fichier JAR tout en spécifiant qu'il doit 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 disant:

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

ou donne l' NoClassDefFoundErrorindication que les bibliothèques ne sont pas trouvées.

J'ai même essayé de refaire le fichier JAR et inclus le librépertoire et le 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 de classe à utiliser?

SnakeDoc
la source

Réponses:

204

Lorsque vous spécifiez, -jarle -cpparamètre 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 librépertoire dans le manifeste (vous pouvez y utiliser des chemins relatifs)
  2. Spécifiez tout ( y compris votre jar) sur la ligne de commande en utilisant -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
un cheval sans nom
la source
22
; au lieu de: si vous utilisez Windows comme suit java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Erreur
Vous ne pouvez pas non plus "inclure" les fichiers jar nécessaires dans un autre fichier jar. Sûr que vous pouvez. Si c'est pour un usage interne (c'est-à-dire que vous vous attendez à ce que l'utilisateur ait des compétences techniques, etc.), vous pouvez simplement demander que l'étape 1, avant d'essayer d'exécuter le fichier jar, soit de s'exécuter unzip MyJar.jar lib/*.jar. Ensuite, comme vous le suggérez, ils peuvent courirjava -cp MyJar.jar:lib/* ...
Roger
3
la déception est que c'est un cas d'utilisation courant pour exécuter un uber jar "tout compris" avec une référence à un fichier de propriétés spécifique au serveur externe. Évidemment pas un bloqueur, mais certainement une commande moins verbeuse si vous pouviez utiliser le -jar et ne pas avoir à spécifier le principal
Andrew Norman
M'a mis du temps à comprendre. Et prend environ 6 lignes pour charger un fichier log4j explicitement. Un autre bogue Java qui ne sera jamais corrigé.
Tuntable
1
Notez que le chemin d'accès aux classes ne peut être utilisé que pour le chargement de fichiers jar. Il ne peut pas être utilisé pour rechercher log4j3.xml, par exemple. M'a bien eu.
Tuntable
34

Exécutez un fichier jar et spécifiez un chemin de classe comme celui-ci:

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

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

libs/* est un chemin vers vos JAR de dépendance

com.test.Appest le nom complet de la classe du JAR qui a la main(String[])méthode

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

Sid
la source
10

Vous pouvez le faire dans un shell unix:

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

Vous pouvez le faire dans Windows PowerShell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
goudrons
la source
4

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 -cpou de spécifier la classe principale. Dans votre cas, il contiendrait des lignes comme celle-ci:

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

Malheureusement, vous devez épeler chaque jar dans le manifeste (ce n'est pas un gros problème comme vous ne le faites qu'une seule 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 dans lequel vous exécutez le fichier java -jar MyJar.jar.

Puis exécutez-le avec

java -jar MyJar.jar
HankCa
la source
Je pense que le chemin de classe doit faire référence à des fichiers dans le pot externe. Je ne pouvais pas faire fonctionner cela en général, pour faire référence aux fichiers de configuration en dehors de MyJar.jar.
Tuntable
0

Vous pouvez faire une Runtime.getRuntime.exec (commande) pour relancer le fichier jar, y compris le chemin de classe avec args.

Tim de Vries
la source