Il classpath è il luogo (i) in cui vengono visualizzati il compilatore java (comando: javac) e la JVM (comando: java) per trovare le classi di riferimento dell'applicazione. Che cosa significa per un'applicazione fare riferimento a un'altra classe? In parole semplici significa utilizzare questa classe da qualche parte nel suo codice:
Esempio:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
Quando si tenta di compilare questo (javac) il compilatore avrà bisogno la classe AnotherClass. Lo stesso quando provi ad eseguire la tua applicazione: la JVM avrà bisogno della classe AnotherClass. Per trovare questa classe, javac e JVM guardano in un particolare (insieme di) posto (i). Questi posti sono specificati dal classpath che su linux è una lista di directory separate da due punti (directory in cui javac/JVM dovrebbe apparire per localizzare AnotherClass quando ne hanno bisogno).
Quindi, per compilare la classe e quindi eseguirla, è necessario assicurarsi che il classpath contenga la directory contenente la classe AnotherClass. Poi si richiama in questo modo:
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
Di solito le classi si presentano sotto forma di "fasci" chiamati file jar/librerie.In questo caso è necessario fare in modo che il vaso che contiene la classe AnotherClass è sulla vostra 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
Negli esempi sopra potete vedere come compilare una classe (MyClass.java) che si trova nella directory di lavoro e quindi eseguire la classe compilata (notare il punto "." all'inizio del classpath che rappresenta la directory corrente). Questa directory deve essere aggiunta anche al classpath. In caso contrario, la JVM non sarà in grado di trovarla.
Se si dispone della classe in un file jar, come specificato nella domanda, è necessario assicurarsi che anche jar sia nel classpath, insieme al resto delle directory necessarie.
Esempio:
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
o più generale (supponendo qualche gerarchia pacchetto):
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it
Al fine di evitare di impostare il percorso di classe ogni volta che si desidera eseguire un'applicazione è possibile definire una variabile d'ambiente chiamato CLASSPATH.
in Linux, in prompt dei comandi:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
o modificare il file ~/.bashrc e aggiungete questa linea da qualche parte alla fine;
Tuttavia, il percorso di classe è soggetto a frequenti modifiche, pertanto è possibile che il percorso di classe sia impostato su un insieme principale di dir, che è necessario frequentemente e quindi estende il percorso di classe ogni volta che è necessario solo per quella sessione. In questo modo:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
Possibile duplicato di [Inclusi tutti i vasi in una directory all'interno del percorso di classe Java] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart