Comment définir la variable CLASSPATH pour un dossier dans Ubuntu

16

Je sais que export CLASSPATH=/usr/local/java/tools.jar:$CLASSPATHcela ajoutera tools.jar au CLASSPATH, mais je veux définir le dossier sur le CLASSPATH

comme ça

export CLASSPATH=/usr/local/java/lib/:$CLASSPATH

mais ça ne marche pas.

Ramesh Kotha
la source

Réponses:

11

Tout d'abord, en général, la définition de la variable env CLASSPATHprovoque généralement plus de problèmes qu'elle n'en résout - car toutes les applications ne veulent pas / n'ont pas besoin du même chemin de classe, et se cassent souvent lorsque des pots indésirables ou même inutiles sont inclus dans le chemin de classe. Une application java ne doit inclure que le nombre minimum de pots requis, ni plus, ni moins.

Lorsque vous avez spécifiques, des applications individuelles qui exigent que le classpath soit défini, généralement l'option de ligne de commande est préférée: java -cp path1:path2:.... Les icônes du bureau peuvent voir leur commande modifiée pour inclure ces options, ou les scripts shell peuvent être modifiés pour inclure ces options.

Cela étant dit (et comme il y a toujours des exceptions à la règle), selon la version de java (cela nécessite java 6 ou une version ultérieure), vous pouvez spécifier qu'un répertoire entier de jars soit ajouté au chemin de classe en ajoutant un " *" à la fin d'un répertoire; par exemple, les éléments suivants:

 /dir1/foo.jar:/dir2/dir3:/dir5/dir6/*:etc...

Veux dire:

  • /dir1/foo.jar - (le pot unique) sera ajouté au chemin de classe;
  • /dir2/dir3- toutes les classes non bloquées dans ce répertoire seront ajoutées au chemin de classe (doivent être dans la structure de package appropriée; par exemple, com.my.Foo.classdoivent être dans /dir2/dir3/com/my/Foo.class)
  • /dir5/dir6/*- tous les fichiers jar de ce répertoire (ie /dir5/dir6/*.jar) seront ajoutés au chemin de classe. Notez que ce " *" n'est pas un caractère générique (vous ne pouvez pas utiliser f*.jarou même *.jar); c'est un caractère spécial indiquant "ajouter tous les pots"

En général, si vous devez ajouter un répertoire entier de fichiers JAR au chemin de classe de l'application, l'application n'a pas été correctement groupée. Au contraire, l'application devrait avoir un manifeste contenant la liste des pots dont elle dépend. Ou à tout le moins, un seul pot doit être ajouté à votre chemin de classe, et ce pot peut avoir dans son manifeste toute la liste des pots dans un sous-répertoire.

Michael
la source
Cela me prend plus de 5 heures pour le comprendre dans Ubuntu 12.04. Après avoir compilé un fichier et exécuté la classe, deux choses sont importantes. 1. Si vous utilisez le package dans votre classe. Et vous devez utiliser "java -cp. ClassName" dans le dossier parent du package. 2. Vous devez utiliser ".:" Comme "java -cp.: / Usr / lib / jvm / java-1.6.0-openjdk-i386 / jre / lib / *: / dir2 / jarlib / *".
zhihong
@zhihong, vous devriez envisager d'utiliser un IDE comme les netbeans, le laissant s'en remettre à l'outil de construction utilisé, qui configure en fait votre chemin de classe. Dans Netbeans, configurez un nouveau projet en utilisant maven ou gradle (ou ant - mais cela devient trop compliqué lorsque vous traitez avec des dépendances (voir aussi: tâches maven ant, que je préfère à ivy)). Gradle est actuellement la chose «chaude», fwiw; Tu devrais essayer. De plus, (1) vous devez toujours utiliser des noms de package; et (2) il n'est jamais nécessaire d'inclure des classes dans le répertoire jvm dans le chemin de classe; ils sont déjà dans le chemin de classe "boot".
michael
merci pour votre suggestion. En fait, j'utilise eclipse, et le code s'exécute correctement là-bas, mais quand je l'exécute dans le terminal, j'ai ensuite obtenu la "ClassNotFoundException". J'ai essayé de nombreuses façons d'ajouter la lib / jar externe, mais tout a échoué. Enfin, cela fonctionne en incluant le répertoire jvm et la bibliothèque externe / jar dans la ligne de commande WITH. Mais, j'ai essayé aujourd'hui, vous avez raison, le répertoire jvm n'est pas nécessaire.
zhihong
2

si vous voulez définir le chemin de classe de façon permanente, alors 1) découvrez où java est installé .. vous pouvez utiliser "whereis java" openjdk-7/6 est dans / usr / lib / jvm / .....

2) nous devons configurer CLASSPATH dans / etc / environment

  sudo gedit /etc/environment

3) ajoutez les likes suivants .. (NE LAISSEZ AUCUN ESPACE PENDANT LE TAPISAGE) (personnaliser en fonction de votre version java et de votre installation) (ce chemin d'accueil est pour open jdk 7)

   JAVA_HOME="/usr/lib/jvm/java-7-openjdk-i386/bin"

   export JAVA_HOME

   CLASSPATH=".:/usr/lib/jvm/java-7-openjdk-i386/lib:/home/laptop/Desktop/a2"

   export CLASSPATH

répertoire séparé par ":"

rightkushagra
la source
Pourquoi est-ce que tout le monde ajoute "{JAVA_HOME} / lib" à son chemin de classe? Ce n'est pas nécessaire, ni même une bonne idée. D'ailleurs, la définition de l'env CLASSPATH est également une mauvaise idée, à moins que ce ne soit dans un script shell, juste pour ce script, auquel cas, l'option de ligne de commande "-cp" sur java serait toujours préférable.
michael
0

terminal ouvert et type

sudo nano ~ / .bashrc

ajoutez toutes les exportations dont vous avez besoin comme ...

export JAVA_HOME = / usr / local / java / jdk1.6.0_06 (votre chemin)

export ANT_HOME = / opt / ant / apache-ant-1.9.4

enfin redémarrer le terminal pour que les modifications prennent effet

maté
la source