classpath es el lugar donde el compilador de java (comando: javac) y la JVM (comando: java) miran para encontrar las clases a las que hace referencia su aplicación. ¿Qué significa para una aplicación hacer referencia a otra clase? En palabras sencillas que significa utilizar esa clase en algún lugar de su código:
Ejemplo:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
Cuando intenta compilar este (javac) el compilador tendrá la clase AnotherClass. Lo mismo cuando intenta ejecutar su aplicación: la JVM necesitará la clase AnotherClass. Para encontrar esta clase, javac y JVM miran en un (a) lugar (es) particular (es). Esos lugares están especificados por el classpath, que en Linux es una lista de directorios separados por dos puntos (directorios donde debe buscar javac/JVM para ubicar el AnotherClass cuando lo necesiten).
Por lo tanto, para compilar su clase y luego ejecutarla, debe asegurarse de que classpath contenga el directorio que contiene la clase AnotherClass. A continuación, se invoca así:
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
Por lo general, las clases se presentan en forma de "paquetes" llamados archivos jar/bibliotecas.En este caso, usted tiene que asegurarse de que el frasco que contiene la clase AnotherClass está en su 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
En los ejemplos anteriores se puede ver cómo compilar una clase (MyClass.java), ubicado en el directorio de trabajo y luego ejecute la clase compilada (Note el "." al comienzo de la ruta de clases que representa el directorio actual). Este directorio también debe agregarse al classpath. De lo contrario, la JVM no podrá encontrarlo.
Si tiene su clase en un archivo jar, como especificó en la pregunta, entonces debe asegurarse de que jar también se encuentre en el classpath, junto con el resto de los directorios necesarios.
Ejemplo:
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
o más generales (suponiendo que alguna jerarquía de paquetes):
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it
Con el fin de evitar el establecimiento de la ruta de clase cada vez que desee ejecutar una aplicación puede definir una variable de entorno llamado CLASSPATH.
En Linux, en el símbolo del sistema:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
o editar el archivo ~/.bashrc y agregar esta línea en algún lugar al final;
Sin embargo, la ruta de clase está sujeta a cambios frecuentes, por lo que es posible que desee establecer classpath en un conjunto central de directorios, que necesita con frecuencia y luego amplía classpath cada vez que necesita solo para esa sesión. De esta manera:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
Posible duplicado de [Incluyendo todos los archivos jar en un directorio dentro del classpath de Java] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart