Avec Java 6 ou une version ultérieure, l'option classpath prend en charge les caractères génériques. Notez ce qui suit :
- Utilisez des guillemets droits (
"
)
- Utilisez
*
pas *.jar
Windows
java -cp "Test.jar;lib/*" my.package.MainClass
Unix
java -cp "Test.jar:lib/*" my.package.MainClass
C'est similaire à Windows, mais utilise :
au lieu de ;
. Si vous ne pouvez pas utiliser de caractères génériques, bash
permet la syntaxe suivante (où lib
est le répertoire contenant tous les fichiers d'archive Java) :
java -cp "$(printf %s: lib/*.jar)"
(Il est à noter que l'utilisation d'un classpath est incompatible avec la fonction -jar
option. Voir aussi : Exécuter un fichier jar avec plusieurs bibliothèques de classpath à partir de l'invite de commande )
Comprendre les caractères génériques
De la Chemin de classe document :
Les entrées du chemin de la classe peuvent contenir le caractère générique du nom de base. *
ce qui est considéré comme équivalent à la spécification d'une liste de tous les fichiers dans le répertoire avec l'extension .jar
ou .JAR
. Par exemple, l'entrée entrée du chemin de la classe foo/*
spécifie tous les fichiers JAR dans le répertoire nommé foo. Une entrée classpath consistant simplement en *
se développe en une liste de tous les fichiers jar dans le répertoire actuel.
Une entrée de chemin de classe qui contient *
ne correspondra pas aux fichiers de classe. Pour correspondre à la fois aux classes et aux fichiers JAR dans un seul répertoire foo, utilisez l'une des deux méthodes suivantes foo;foo/*
ou foo/*;foo
. L'ordre choisi détermine si les classes et ressources en foo
sont chargés avant les fichiers JAR dans foo
ou vice versa.
Les sous-répertoires ne sont pas recherchés de manière récursive. Par exemple, foo/*
cherche pour les fichiers JAR uniquement dans foo
et non dans foo/bar
, foo/baz
etc.
L'ordre dans lequel les fichiers JAR d'un répertoire sont énumérés dans le chemin d'accès étendu aux classes n'est pas spécifique. dans le chemin d'accès élargi de la classe n'est pas spécifié et peut varier d'une plateforme et même d'un moment à l'autre sur la même machine. A application bien construite ne devrait pas dépendre d'un ordre particulier. ordre particulier. Si un ordre spécifique est requis, alors les fichiers JAR peuvent être énumérés explicitement dans le chemin de la classe.
L'expansion des jokers se fait en amont, avant l'invocation de la méthode principale d'un programme, plutôt qu'en aval, pendant la durée de l'exécution. d'un programme, plutôt que tardivement, pendant le processus de chargement des lui-même. Chaque élément du chemin de la classe d'entrée contenant un contenant un joker est remplacé par la séquence (éventuellement vide) d'éléments générée par l'énumération des fichiers JAR dans le répertoire nommé. Pour exemple, si le répertoire foo
contient a.jar
, b.jar
et c.jar
alors le chemin de la classe foo/*
est transformé en foo/a.jar;foo/b.jar;foo/c.jar
, et cette chaîne serait la valeur de la propriété système java.class.path
.
Le site CLASSPATH
n'est pas traitée différemment de la variable d'environnement l'adresse -classpath
(ou -cp
) de la ligne de commande. C'est-à-dire que les caractères génériques sont sont honorés dans tous ces cas. Cependant, les caractères génériques des chemins de classe ne sont pas respectés dans l'option Class-Path jar-manifest
en-tête.
Remarque : en raison d'un bogue connu dans java 8, les exemples Windows doivent utiliser une barre oblique inverse précédant les entrées avec un astérisque de fin : https://bugs.openjdk.java.net/browse/JDK-8131329
4 votes
Désolé, je ne l'ai jamais accepté. Cela devrait être un wiki communautaire. Je n'ai jamais utilisé une des réponses fournies. Je crois que j'ai créé un shell script qui a juste scanné le répertoire lib/ et créé le classpath à partir de l'analyse des noms de fichiers.
0 votes
Il y a une sorte de bogue dans cette nouvelle fonctionnalité Java, car elle ne fonctionne pas comme décrit. J'ai abandonné et utilisé Ant pour le contourner, comme décrit dans l'une des réponses.
1 votes
Il y a un problème avec le traitement des caractères génériques dans Windows. stackoverflow.com/questions/11607873/
0 votes
Au début, je pensais que le
.
aprèsjar:
est mis par erreur mais..... Le symbole standard pour `répertoire courant' est un simple point (.) dans les systèmes Unix et Windows.8 votes
Réponse courte : (1) laisser tomber le
.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
0 votes
Je suis vraiment désolé mais comme il s'agit d'une question populaire et que je ne peux pas poser ma propre question, je cherche la réponse d'un expert Java pour savoir quelle est la différence entre le drapeau create et create new à cet endroit. github.com/frohoff/jdk8u-jdk/blob/master/src/solaris/classes/