D'accord, je suis très nouveau sur Linux et la ligne de commande, et assez nouveau sur Java. J'ai eu un stage en construction d'un programme Java. Je l’ai enfin fait sur ma machine (Windows) et maintenant je dois le migrer sur une machine Linux pour le tester puis le lancer en tant qu’exécutable. J'ai beaucoup lu et étudié sur Linux et sur la compréhension des classpaths, mais il est toujours très difficile à comprendre complètement. C'est juste que je ne clique pas encore pour moi. Quelqu'un peut-il expliquer le but de classpath d'une manière simplifiée à l'aide d'exemples? Pour moi, l’un des aspects les plus déroutants est la définition du chemin physique vers le pot. Est-ce que je commence tout le chemin depuis usr ou dois-je seulement commencer par le dossier jvm? Si cela compte, mon programme Java ne se trouve pas dans le dossier jvm. Quelqu'un peut-il m'éclairer?
EDIT: merci beaucoup pour votre aide, je ne peux pas dire que je suis tout à fait clair mais ma compréhension de ma situation est bien meilleure.
Vous utilisez l'argument -classpath
. Vous pouvez utiliser un chemin relatif ou absolu. Cela signifie que vous pouvez utiliser un chemin relatif à votre répertoire actuel. OR, vous pouvez utiliser un chemin absolu commençant à la racine /
.
Exemple:
bash$ Java -classpath path/to/jar/file MyMainClass
Dans cet exemple, la fonction main
est située dans MyMainClass
et serait incluse quelque part dans le fichier jar.
Pour compiler, vous devez utiliser javac
Exemple:
bash$ javac -classpath path/to/jar/file MyMainClass.Java
Vous pouvez également spécifier le chemin de classe via la variable d'environnement, suivez cet exemple :
bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.Java
Pour tout projet Java normalement complexe, vous devez rechercher le script Ant nommé build.xml
Supposons que vous avez plusieurs fichiers jar a.jar, b.jar et c.jar. Pour les ajouter à classpath lors de la compilation, vous devez faire
$javac -cp .:a.jar:b.jar:c.jar HelloWorld.Java
Courir faire
$Java -cp .:a.jar:b.jar:c.jar HelloWorld
Le chemin d'accès aux classes est le ou les lieux où le compilateur Java (commande: javac) et la machine virtuelle Java (commande: Java) recherchent les classes auxquelles votre application fait référence. Qu'est-ce que cela signifie pour une application de référencer une autre classe? En termes simples, cela signifie utiliser cette classe quelque part dans son code:
Exemple:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
Lorsque vous essayez de compiler ceci (javac), le compilateur aura besoin de la classe AnotherClass. Idem lorsque vous essayez d'exécuter votre application: la machine virtuelle Java aura besoin de la classe AnotherClass . Afin de trouver cette classe, le javac et la machine virtuelle Java se trouvent dans un (des) emplacement (s) particulier (s). Ces emplacements sont spécifiés par le chemin de classe qui, sous Linux, est une liste de répertoires séparés par des points-virgules (répertoires dans lesquels javac/JVM doit rechercher afin de localiser la AnotherClass quand ils en ont besoin).
Ainsi, afin de compiler votre classe, puis de l'exécuter, vous devez vous assurer que le chemin d'accès aux classes contient le répertoire contenant la classe AnotherClass. Ensuite, vous l'invoquez comme ceci:
javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.Java //to compile it
Java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it
Les classes se présentent généralement sous la forme de "bundles" appelés fichiers/bibliothèques jar. Dans ce cas, vous devez vous assurer que le fichier jar contenant la classe AnotherClass est sur votre classpaht:
javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.Java //to compile it
Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it
Dans les exemples ci-dessus, vous pouvez voir comment compiler une classe (MyClass.Java) située dans le répertoire de travail, puis exécuter la classe compilée (notez le "." Au début du chemin de classe qui représente le répertoire en cours). Ce répertoire doit également être ajouté au classpath. Sinon, la machine virtuelle Java ne pourra pas le trouver.
Si vous avez votre classe dans un fichier jar, comme vous l'avez spécifié dans la question, vous devez vous assurer que ce fichier est également dans le chemin de classe, ainsi que le reste des répertoires nécessaires.
Exemple:
Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
ou plus général (en supposant une certaine hiérarchie de paquets):
Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it
Afin d'éviter de définir le chemin d'accès aux classes à chaque fois que vous souhaitez exécuter une application, vous pouvez définir une variable d'environnement appelée CLASSPATH.
Sous Linux, à l'invite de commande:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
ou éditez le ~/.bashrc et ajoutez cette ligne quelque part à la fin;
Toutefois, le chemin de classe est sujet à de fréquents changements. Par conséquent, vous pouvez définir le chemin de classe sur un ensemble de répertoires de base, dont vous avez souvent besoin, puis étendre le chemin de classe à chaque fois que vous avez besoin de cette session. Comme ça:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
Étape 1.
vi ~/.bashrc
Étape 2. Ajoutez cette ligne à la dernière:
export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib)
Étape 3.
source ~/.bashrc
Après ces étapes, complétez directement et exécutez vos programmes (par exemple, javac xyz.Java)