398 votes

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

Je lisais justement cette ligne :

La première chose que fait la méthode format() est de charger un modèle Velocity dans le classpath nommé output.vm.

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

655voto

bokmann Points 694

Lors de la programmation en langage Java, vous faites d'autres classes disponibles à la classe que vous avez écrit en mettant quelque chose de ce genre en haut de votre fichier source:

import org.javaguy.coolframework.MyClass

ou parfois, vous 'importation en bloc" trucs en disant:

import org.javaguy.coolframework.*

tard dans votre programme quand vous dites:

mine = MyClass.new();

la machine virtuelle java peut savoir pour charger votre classe compilée.

Il serait impossible d'avoir la VM regarder à travers tous les dossiers sur votre ordinateur, vous devez fournir la VM une liste des endroits à regarder. Ceci est fait en mettant le dossier et les fichiers jar sur votre classpath.

Avant de nous parler de la façon dont la classe est définie, permet de parler de .les fichiers de classe, les paquets, et .les fichiers jar.

Tout d'abord, supposons que MyClass est quelque chose que vous avez construit dans le cadre de votre projet, et il est dans un répertoire de votre projet appelé "production". L' .fichier de classe serait à 'output/org/javaguy/coolframework/MyClass.class' (avec tous les autres fichiers dans le paquet). pour obtenir ce fichier, votre chemin serait tout simplement besoin de contenir le dossier "sortie" ... pas l'ensemble de la structure, depuis votre instruction d'importation fournit toutes les informations de la machine virtuelle.

Maintenant, laisse supposer que vous bundle CoolFramework dans une .fichier jar, et de mettre CoolFramework.jar dans un répertoire lib de votre projet. vous aurez besoin de mettre 'lib/CoolFramework.jar" dans votre classpath... la VM va regarder à l'intérieur th fichier jar de l' 'org/javaguy/coolpackage' partie, et de trouver votre classe.

Ainsi, les chemins de classe contiennent:

  • les fichiers jar, et
  • les chemins vers le HAUT de l'emballage des hiérarchies.

Comment définissez-vous votre classpath?

La première façon, tout le monde semble d'apprendre, c'est 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 aller à vos paramètres d'environnement et d'ajouter ou de modifier la valeur qui est déjà là.

La deuxième façon est d'utiliser l'option-cp paramètre lors du démarrage de Java, comme ceci:

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

Une variante de cette troisième voie est souvent fait avec un .sh ou .fichier bat qui calcule le chemin de la classe et le transmet à java par le paramètre cp.

Alors, quel est le meilleur moyen de le faire?

Réglage des trucs à l'échelle mondiale via des variables d'environnement est mauvais... en général, pour le même genre de raisons que les variables globales sont mauvais. Vous modifiez la variable d'environnement CLASSPATH si un programme fonctionne, et vous finissez à la rupture d'un autre programme.

Le cp est le chemin à parcourir... en général, je sais que mes variable d'environnement CLASSPATH est une chaîne vide où je développe, chaque fois que possible, de sorte que j'évite chemin de classe global questions (certains outils ne sont pas heureux quand le chemin de classe global est vide si - je sais des deux communes, les méga-mille dollars sous licence J2EE et Java serveurs qui ont ce genre de problème avec leurs outils de ligne de commande).

14 votes

1 votes

En python, il y a un dossier appelé Lib où vous pouvez stocker n'importe quel module à utiliser à tout moment avec une simple déclaration d'importation. Est-ce différent que de définir la variable d'environnement CLASSPATH sur un répertoire pour les paquets java tiers ? Même s'il s'agit d'une variable globale, il n'est pas nécessaire de la modifier, à part pour ajouter d'autres paquets.

0 votes

Bonne réponse, mais pour les nuls ici : Pourquoi n'avez-vous pas besoin d'utiliser la commande -cp pour chaque nouvelle classe que vous créez ? Ce problème est sûrement résolu automatiquement par votre système, n'est-ce pas ? Mais comment ? Je rencontre parfois un problème où "quelque chose" est introuvable dans mon classpath - je suppose que c'est parce que je ne l'ai pas ajouté au cp, mais pourquoi une telle erreur ne se produit-elle que parfois au lieu de toujours ? Je pose cette question parce que, pour être honnête, je n'ai jamais inclus quoi que ce soit manuellement avec la commande -cp et je ne saurais pas quoi faire avec une erreur comme celle-là

90voto

Ninefingers Points 18767

Considérez-le comme la réponse de Java à la variable d'environnement PATH - les systèmes d'exploitation recherchent les EXE dans le PATH, Java recherche les classes et les paquets dans le classpath.

17voto

Desintegr Points 3330

Le classpath est le chemin par lequel la machine virtuelle Java recherche les classes, paquets et ressources définis par l'utilisateur dans les programmes Java.

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

5voto

Romain Points 7339

Le classpath dans ce contexte est exactement ce qu'il est dans le contexte général : partout où la VM sait qu'elle peut trouver des classes à charger, ainsi que des ressources (comme output.vm dans votre cas).

Je crois comprendre que Velocity s'attend à trouver un fichier nommé output.vm n'importe où dans "no package". Cela peut être un JAR, un dossier ordinaire, ... La racine de n'importe quel emplacement dans le classpath de l'application.

-2voto

JasonHuang Points 588

Classpath et path sont les variables d'environnement. en général, vous devez mettre jdk/bin dans path pour pouvoir utiliser le compilateur java partout, classpath est le chemin de vos fichiers .class. le classpath a un chemin par défaut un point (.) qui signifie le répertoire courant. mais quand vous utilisez les paquets, vous devez soit spécifier le chemin complet du fichier .class, soit mettre le chemin du fichier .class dans le classpath, ce qui économise beaucoup de travail !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X