web-dev-qa-db-fra.com

Qu'est-ce qu'un classpath et comment le définir?

Je viens de lire cette ligne:

La première chose que fait la méthode format () est de charger un modèle Velocity à partir du chemin de classe nommé output.vm.

Veuillez expliquer ce que signifie classpath dans ce contexte et comment définir le classpath.

293
Blankman

Lorsque vous programmez en Java, vous mettez d'autres classes à la disposition de la classe que vous écrivez en plaçant quelque chose comme ceci en haut de votre fichier source:

import org.javaguy.coolframework.MyClass;

Ou parfois, vous importez en vrac des choses en disant:

import org.javaguy.coolframework.*;

Donc plus tard dans votre programme quand vous dites:

MyClass mine = new MyClass();

La machine virtuelle Java saura où trouver votre classe compilée.

Il serait peu pratique de demander à la VM de parcourir tous les dossiers de votre ordinateur. Vous devez donc fournir à la VM une liste de lieux à consulter. Ceci est fait en mettant des dossiers et des fichiers jar sur votre classpath.

Avant de parler de la définition du classpath, parlons des fichiers .class, des packages et des fichiers .jar.

Tout d'abord, supposons que MyClass soit quelque chose que vous avez construit dans le cadre de votre projet et qu'il se trouve dans un répertoire de votre projet appelé output. Le fichier .class serait à output/org/javaguy/coolframework/MyClass.class (avec tous les autres fichiers de ce paquet). Pour accéder à ce fichier, votre chemin doit simplement contenir le dossier "sortie", et non la structure complète du package, car votre déclaration d'importation fournit toutes ces informations à la machine virtuelle.

Supposons maintenant que vous intégriez CoolFramework dans un fichier .jar et que vous placiez ce fichier dans un répertoire lib de votre projet. Vous devez maintenant mettre lib/CoolFramework.jar dans votre chemin de classe. La VM cherchera dans le fichier jar la partie org/javaguy/coolframework et trouvera votre classe.

Donc, les chemins de classes contiennent:

  • Fichiers JAR, et
  • Chemins vers le haut des hiérarchies de paquets.

Comment définissez-vous votre classpath?

Tout le monde semble apprendre en premier lieu avec les variables d'environnement. Sur une machine Unix, vous pouvez dire quelque chose comme:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

Sur une machine Windows, vous devez accéder aux paramètres de votre environnement et ajouter ou modifier la valeur déjà présente.

La deuxième méthode consiste à utiliser le paramètre -cp lors du démarrage de Java, comme suit:

Java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

Une variante de cette méthode est la troisième méthode souvent utilisée avec un fichier .sh ou .bat qui calcule le chemin de classe et le transmet à Java via le paramètre -cp.

Il y a un "gotcha" avec tout ce qui précède. Sur la plupart des systèmes (Linux, Mac OS, UNIX, etc.), le caractère deux-points (':') est le séparateur de chemin de classe. Dans windowsm, le séparateur est le point-virgule (';')

Alors, quelle est la meilleure façon de le faire?

Définir des éléments globalement via des variables d'environnement est mauvais, généralement pour les mêmes raisons que les variables globales. Vous modifiez la variable d'environnement CLASSPATH pour qu'un programme fonctionne, et vous finissez par interrompre un autre programme.

Le -cp est la voie à suivre. En général, je m'assure que ma variable d'environnement CLASSPATH est une chaîne vide dans laquelle je développe, autant que possible, afin d'éviter les problèmes liés au chemin d'accès aux classes globales (certains outils ne sont pas satisfaisants lorsque le chemin d'accès aux classes globales est vide - je connais deux méga-milliers Les serveurs J2EE et Java sous licence Dollar qui rencontrent ce type de problème avec leurs outils de ligne de commande).

476
bokmann

Considérez-le comme la réponse de Java à la variable d’environnement PATH - les systèmes d’exploitation recherchent les fichiers EXE sur le chemin PATH, Java recherche les classes et les packages dans le chemin de classes.

56
user257111

Le chemin d'accès aux classes est le chemin où la machine virtuelle Java recherche les classes, les packages et les ressources définis par l'utilisateur dans les programmes Java.

Dans ce contexte, la méthode format() charge un fichier de modèle à partir de ce chemin.

11
Desintegr

Le chemin d'accès aux classes dans ce contexte correspond exactement à ce qu'il est dans le contexte général: partout où le VM sait qu'il peut trouver des classes à charger, ainsi que des ressources (comme output.vm dans votre cas).

Je comprendrais que Velocity s'attend à trouver un fichier nommé output.vm n'importe où dans "no package". Cela peut être un fichier JAR, un dossier normal, ... La racine de n’importe quel emplacement du chemin de classe de l’application.

5
Romain

Définition de la variable système CLASSPATH

Pour afficher la variable CLASSPATH actuelle, utilisez ces commandes sous Windows et UNIX (Bourne Shell): Sous Windows: C:\> set CLASSPATH Sous UNIX: % echo $CLASSPATH

Pour supprimer le contenu actuel de la variable CLASSPATH, utilisez les commandes suivantes: Sous Windows: C:\> set CLASSPATH= Sous UNIX: % unset CLASSPATH; export CLASSPATH

Pour définir la variable CLASSPATH, utilisez les commandes suivantes (par exemple): Sous Windows: C:\> set CLASSPATH=C:\users\george\Java\classes Sous UNIX: % CLASSPATH=/home/george/Java/classes; export CLASSPATH

2
lft93ryt

CLASSPATH est une variable d'environnement (c'est-à-dire des variables globales du système d'exploitation disponibles pour tous les processus) nécessaire au compilateur Java et à l'exécution pour localiser les packages Java utilisés dans un fichier Java programme. (Pourquoi ne pas appeler PACKAGEPATH?) Cette procédure est similaire à une autre variable d’environnement PATH, utilisée par le shell CMD pour rechercher les programmes exécutables.

CLASSPATH peut être défini de l’une des manières suivantes:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel ⇒ System ⇒ Advanced ⇒ Environment Variables ⇒ choose "System Variables" (for all the users) or "User Variables" (only the currently login user) ⇒ choose "Edit" (if CLASSPATH already exists) or "New" ⇒ Enter "CLASSPATH" as the variable name ⇒ Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\Tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD Shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\Tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and Java commands, for example,

> Java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
1
Unnati Solanki

Environment variable est une variable système globale accessible à tous les processus exécutés sous le système d'exploitation.

classpath dans Java est un environment variable utilisé par Java une machine virtuelle pour localiser ou trouver des fichiers de classe (.class) dans Java pendant le chargement de classe par ClassLoader.

Le compilateur Java (javac), Java Runtime (Java) et d'autres outils Java recherchent les classes utilisées dans votre programme dans cet ordre:

  1. Classes de la plateforme Java (bootstrap)
  2. Répertoires d'extension Java
  3. Chemin de recherche des classes d'utilisateurs (classpath): déterminé dans l'ordre suivant:

    une. La valeur par défaut est current working directory (.).

    b. Entrées dans la classpathenvironment variable, qui remplace la valeur par défaut.

    c. Entrées dans l'option de ligne de commande -cp (ou -classpath), qui remplace la variable d'environnement classpath.

    ré. L'option de ligne de commande d'exécution -jar, qui remplace tout ce qui précède.

La variable d'environnement classpath peut inclure des répertoires (contenant de nombreux fichiers de classe) et des fichiers JAR (une archive à fichier unique de fichiers de classe). Si classpath n'est pas défini, la valeur par défaut est current directory. Si vous définissez la classpath, il est important d'inclure la current working directory (.). Sinon, le répertoire en cours ne sera pas recherché.

Vous pouvez remplacer classpath en Java, défini par environment variable en fournissant l’option -cp ou -classpath pendant l’exécution du programme Java. C’est le meilleur moyen d’avoir different classpath pour différentes Java applications s'exécutant sur le même ordinateur Unix ou Windows.

Java -cp "<path/1><separator><path/2>" <path.to.your.MainClass>

les séparateurs sont des points-virgules ; - Windows, deux points : - Linux

Par exemple commande pour MacOS

Java -cp "Test.jar:lib/*" my.package.MainClass

En savoir plus ici et ici

1
yoAlex5

Classpath est une variable d'environnement du système. Le paramètre de cette variable est utilisé pour fournir la racine de toute hiérarchie de packages au compilateur Java.

1
Bimalendu nath

Un membre statique d'une classe peut être appelé directement sans créer d'instance d'objet. Etant donné que la méthode principale est static Java, la machine virtuelle peut l’appeler sans créer d’instance de classe contenant la méthode principale, qui constitue le point de départ du programme.

0
Sumanth Ydt