Existe-t-il un moyen d'inclure tous les fichiers jar dans un répertoire dans le chemin de classe?
J'essaie java -classpath lib/*.jar:. my.package.Program
et il n'est pas en mesure de trouver des fichiers de classe qui se trouvent certainement dans ces pots. Dois-je ajouter chaque fichier jar au chemin de classe séparément?
java
command-line
classpath
Chris Serra
la source
la source
.jar
partie, (2) doit avoir au moins 2 parties, séparées par un;
sur Windows (qui est généralement:
ailleurs). Par exemple:java -classpath ".;lib/*" Program
Réponses:
À l'aide de Java 6 ou version ultérieure, l'option classpath prend en charge les caractères génériques. Notez les points suivants:
"
)*
, pas*.jar
les fenêtres
Unix
Ceci est similaire à Windows, mais utilise à la
:
place de;
. Si vous ne pouvez pas utiliser de caractères génériques,bash
autorise la syntaxe suivante (où selib
trouve le répertoire contenant tous les fichiers d'archive Java):(Notez que l'utilisation d'un chemin de classe est incompatible avec l'
-jar
option. Voir aussi: Exécuter un fichier jar avec plusieurs bibliothèques de chemin de classe à partir de l'invite de commande )Comprendre les caractères génériques
Depuis le document Classpath :
Remarque: en raison d'un bogue connu dans java 8, les exemples de fenêtres doivent utiliser une barre oblique inversée précédant les entrées d'un astérisque de fin: https://bugs.openjdk.java.net/browse/JDK-8131329
la source
tr
fonctionne!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
sans guillemets et cela fonctionne très bien. Je me demande pourquoi le shell ne l'étend pas et ne fait pas d'erreur?~
dans le -cpSous Windows, cela fonctionne:
et cela ne fonctionne pas:
notez le * .jar, donc le caractère générique * doit être utilisé seul .
Sous Linux, les travaux suivants:
Les séparateurs sont des deux-points au lieu de points-virgules.
la source
*.jar
mais seulement avec*
.:
sur une plateforme et;
sur l'autre. :) Je compile avec Java à partir de la ligne de commande environ une fois par an, juste assez pour ne pas me souvenir de la fréquence, mais assez ennuyeux.Nous contournons ce problème en déployant un fichier jar principal
myapp.jar
qui contient un fichier manifest (Manifest.mf
) spécifiant un chemin de classe avec les autres jars requis, qui sont ensuite déployés à côté. Dans ce cas, vous devez uniquement déclarerjava -jar myapp.jar
lors de l'exécution du code.Donc, si vous déployez le principal
jar
dans un répertoire, puis placez les pots dépendants dans unlib
dossier en dessous, le manifeste ressemble à:NB: ceci est indépendant de la plateforme - nous pouvons utiliser les mêmes pots pour lancer sur un serveur UNIX ou sur un PC Windows.
la source
Ma solution sur Ubuntu 10.04 utilisant java-sun 1.6.0_24 ayant tous les pots dans le répertoire "lib":
Si cela échoue, la commande suivante devrait fonctionner (affiche tous les * .jars du répertoire lib dans le paramètre classpath)
la source
Réponse courte:
java -classpath lib/*:. my.package.Program
Oracle fournit de la documentation sur l'utilisation des caractères génériques dans les chemins de classe ici pour Java 6 et ici pour Java 7 , sous la rubrique Comprendre les caractères génériques de chemin de classe . (Au moment où j'écris ceci, les deux pages contiennent les mêmes informations.) Voici un résumé des points saillants:
En général, pour inclure tous les fichiers JAR dans un répertoire donné, vous pouvez utiliser le caractère générique
*
( pas*.jar
).Le caractère générique ne correspond qu'aux fichiers JAR, pas aux fichiers de classe; pour obtenir toutes les classes dans un répertoire, il suffit de terminer l'entrée classpath au nom du répertoire.
Les deux options ci-dessus peuvent être combinées pour inclure tous les fichiers JAR et de classe dans un répertoire, et les règles de priorité de chemin de classe habituelles s'appliquent. Par exemple
-cp /classes;/jars/*
Le caractère générique ne recherchera pas les fichiers JAR dans les sous-répertoires.
Les puces ci-dessus sont vraies si vous utilisez la
CLASSPATH
propriété système ou les indicateurs de ligne de commande-cp
ou-classpath
. Cependant, si vous utilisez leClass-Path
tête du manifeste JAR (comme vous pourriez le faire avec un fichier de génération de fourmis), les caractères génériques ne seront pas honorés.Oui, mon premier lien est le même que celui fourni dans la réponse la mieux notée (que je n'ai aucun espoir de dépasser), mais cette réponse ne fournit pas beaucoup d'explications au-delà du lien. Étant donné que ce type de comportement est déconseillé sur Stack Overflow ces jours-ci , je pensais que je développerais cela.
la source
Windows :
Linux :
Rappel:
- Le séparateur de chemin Windows est
;
- Le séparateur de chemin Linux est
:
- Dans Windows si l'argument cp ne contient pas d'espace blanc, les "guillemets" sont facultatifs
la source
Pour moi, cela fonctionne sous Windows.
Pour linux
J'utilise Java 6
la source
Vous pouvez essayer java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlRépertoire des fichiers jars externes lors de l'exécution de java
la source
-Djava.ext.dirs=
AVANT-jar
Correct :
Incorrect:
la source
Si vous avez vraiment besoin de spécifier dynamiquement tous les fichiers .jar, vous pouvez utiliser des scripts shell ou Apache Ant . Il y a un projet commun appelé Commons Launcher qui vous permet essentiellement de spécifier votre script de démarrage en tant que fichier de génération de fourmis (si vous voyez ce que je veux dire).
Ensuite, vous pouvez spécifier quelque chose comme:
Dans votre fichier de lancement, qui lancera votre application avec le chemin de classe correct.
la source
Si vous utilisez Java 6, vous pouvez utiliser des caractères génériques dans le chemin de classe.
Il est maintenant possible d'utiliser des caractères génériques dans la définition du chemin de classe:
Réf: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
la source
Veuillez noter que l'extension générique est interrompue pour Java 7 sous Windows.
Consultez ce problème StackOverflow pour plus d'informations.
La solution consiste à mettre un point-virgule juste après le caractère générique.
java -cp "somewhere/*;"
la source
À qui cela concerne,
J'ai trouvé cet étrange comportement sur Windows sous un shell MSYS / MinGW.
Travaux:
Ne fonctionne pas:
Je suis tout à fait sûr que le caractère générique n'est pas développé par le shell, car par exemple
(J'ai également essayé avec un autre programme, plutôt qu'avec le programme intégré
echo
, avec le même résultat.)Je crois que c'est ce
javac
qui essaie de le développer, et il se comporte différemment, qu'il y ait ou non un point-virgule dans l'argument. Tout d'abord, il peut essayer de développer tous les arguments qui ressemblent à des chemins. Et seulement alors, il les analyserait,-cp
en ne prenant que le jeton suivant. (Notez quecom.comsol.aco_1.0.0.jar
c'est le deuxième JAR de ce répertoire.) C'est une supposition.C'est
la source
Toutes les solutions ci-dessus fonctionnent très bien si vous développez et exécutez l'application Java en dehors de n'importe quel IDE comme Eclipse ou Netbeans.
Si vous êtes sous Windows 7 et avez utilisé Eclipse IDE pour le développement en Java, vous pouvez rencontrer des problèmes si vous utilisez l'invite de commandes pour exécuter les fichiers de classe créés dans Eclipse.
Par exemple, votre code source dans Eclipse a la hiérarchie de packages suivante: edu.sjsu.myapp.Main.java
Vous avez json.jar comme dépendance externe pour Main.java
Lorsque vous essayez d'exécuter Main.java à partir d'Eclipse, il s'exécute sans aucun problème.
Mais lorsque vous essayez de l'exécuter à l'aide de l'invite de commandes après avoir compilé Main.java dans Eclipse, cela provoquera des erreurs étranges disant "Erreur ClassNotDef bla bla".
Je suppose que vous êtes dans le répertoire de travail de votre code source !!
Utilisez la syntaxe suivante pour l'exécuter à partir de l'invite de commandes:
[Ne manquez pas le. au dessus de]
En effet, vous avez placé le fichier Main.java dans le package edu.sjsu.myapp et java.exe recherchera le modèle exact.
J'espère que cela aide !!
la source
Pour Windows, des devis sont requis et; doit être utilisé comme séparateur. par exemple:
la source
Forme courte: si votre main se trouve dans un bocal, vous aurez probablement besoin d'un '-jar pathTo / yourJar / YourJarsName.jar' explicitement déclaré pour le faire fonctionner (même si 'YourJarsName.jar' était sur le chemin de classe) (ou , exprimé pour répondre à la question initiale posée il y a 5 ans: vous n'avez pas besoin de redéclarer chaque pot de manière explicite, mais il semble, même avec java6, vous devez redéclarer votre propre pot ...)
Forme longue: (J'ai rendu cela explicite au point que j'espère que même les intrus de Java pourront l'utiliser)
Comme beaucoup ici, j'utilise eclipse pour exporter des pots: (Fichier-> Exporter -> 'Fichier JAR exécutable'). Il existe trois options sur les offres d'éclipse (Juno) de «gestion des bibliothèques»:
En général, j'utilisais opt2 (et opt1 cassait définitivement), mais le code natif dans l'un des pots que j'utilise, j'ai découvert des ruptures avec l'astuce "jarinjar" pratique qu'éclipse utilise lorsque vous choisissez cette option. Même après avoir réalisé que j'avais besoin d'opt3, puis trouver cette entrée StackOverflow, il m'a fallu un certain temps pour comprendre comment lancer mon principal en dehors d'Eclipse, alors voici ce qui a fonctionné pour moi, car il est utile pour les autres ...
Si vous avez nommé votre jar: "fooBarTheJarFile.jar" et que tout est configuré pour être exporté dans le répertoire: "/ theFully / qualifiéPath / toYourChosenDir".
(ce qui signifie que le champ «Destination d'exportation» se lira: «/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar»)
Une fois que vous avez terminé, vous trouverez eclipse puis place toutes les bibliothèques dans un dossier nommé 'fooBarTheJarFile_lib' dans ce répertoire d'exportation, vous donnant quelque chose comme:
Vous pouvez ensuite lancer depuis n'importe où sur votre système avec:
(Pour les débutants Java: 'package.path_to.the_class_with.your_main' est le chemin de package déclaré que vous trouverez en haut du fichier 'TheClassWithYourMain.java' qui contient les 'main (String [] args) {.. .} 'que vous souhaitez exécuter depuis l'extérieur de java)
Le piège à remarquer: est que le fait d'avoir 'fooBarTheJarFile.jar' dans la liste des pots sur votre chemin de classe déclaré n'est pas suffisant. Vous devez déclarer explicitement '-jar' et redéclarer l'emplacement de ce pot.
par exemple, cela casse:
retraité avec des chemins relatifs:
(en utilisant la version java "1.6.0_27"; via OpenJDK 64-Bit Server VM sur Ubuntu 12.04)
la source
La seule façon dont je sais comment le faire est de le faire individuellement, par exemple:
J'espère que cela pourra aider!
la source
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
classe de wepapp:
la source
Vous devez les ajouter tous séparément. Alternativement, si vous avez vraiment besoin de simplement spécifier un répertoire, vous pouvez tout supprimer dans un seul répertoire et l'ajouter à votre chemin de classe. Cependant, je ne recommande pas cette approche car vous risquez des problèmes bizarres dans la gestion des versions de classpath et la non-gérabilité.
la source
Ce n'est pas une solution directe pour pouvoir définir / * sur -cp mais j'espère que vous pourrez utiliser le script suivant pour alléger un peu la situation pour les chemins de classe dynamiques et les répertoires lib.
Scripté pour Linux, pourrait également en avoir un similaire pour Windows. Si le répertoire approprié est fourni comme entrée dans les "libDir2Scan4jars"; le script analysera tous les fichiers JAR, créera une chaîne de chemin de classe et l'exportera vers une variable env "tmpCLASSPATH".
la source
macOS, dossier actuel
Pour Java 13 sur macOS Mojave …
Si tous vos
.jar
fichiers sont dans le même dossier, utilisezcd
pour en faire votre répertoire de travail actuel . Vérifiez avecpwd
.Pour le,
-classpath
vous devez d'abord répertorier le fichier JAR de votre application. En utilisant un caractère deux-points:
comme délimiteur, ajoutez un astérisque*
pour obtenir tous les autres fichiers JAR dans le même dossier. Enfin, passez le nom complet du package de la classe avec votremain
méthode .Par exemple, pour une application dans un fichier JAR nommé
my_app.jar
avec unemain
méthode dans une classe nomméeApp
dans un package nommécom.example
, à côté de quelques pots nécessaires dans le même dossier:la source
Considérez un fichier jar comme la racine d'une structure de répertoires. Oui, vous devez les ajouter tous séparément.
la source
Définissez le chemin de classe d'une manière appropriée pour plusieurs fichiers JAR et les fichiers de classe du répertoire actuel.
la source
J'ai plusieurs pots dans un dossier. La commande ci-dessous a fonctionné pour moi
JDK1.8
afin d'inclure tous les pots présents dans le dossier. Veuillez noter que pour inclure entre guillemets si vous avez un espace dans le chemin de classeles fenêtres
Compilation:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Fonctionnement:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Compilation:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Fonctionnement:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
la source
J'essaie d'exécuter le fichier Java en tant que jar ou en tant que classes dans Ubuntu. J'ai échoué dans les deux options. L'exception suivante est sa sortie.
ou
ou
J'ai trouvé la réponse:
Ma stupidité.
Première étape: vous devez paramétrer le Java correspondant: j'avais Java 11 mais j'ai défini comme chemin de lib Java la 8ème version! - Vous pouvez définir la version Java à partir d'ici:
2ème étape: exécutez ensuite la commande suivante, en changeant les noms de chemin et de fichier en votre chemin et fichiers correspondants:
Il a été exécuté avec succès!
la source