Classpath es un parámetro de la máquina virtual Java o del compilador Java que especifica la ubicación de las clases y los paquetes definidos por el usuario . El parámetro se puede configurar en la línea de comandos o mediante una variable de entorno .
De manera similar al comportamiento clásico de carga dinámica , al ejecutar programas Java , la máquina virtual Java busca y carga las clases de manera diferida (carga el código de bytes de una clase solo cuando la clase se utiliza por primera vez). La ruta de clases le indica a Java dónde buscar en el sistema de archivos los archivos que definen estas clases.
La máquina virtual busca y carga clases en este orden:
jre/lib/ext/
De forma predeterminada, solo se puede acceder a los paquetes de la API estándar del JDK y a los paquetes de extensión sin necesidad de especificar dónde encontrarlos. La ruta de todos los paquetes y bibliotecas definidos por el usuario debe establecerse en la línea de comandos (o en el manifiesto asociado con el archivo Jar que contiene las clases).
Supongamos que tenemos un paquete llamado org.mypackage que contiene las clases:
y los archivos que definen este paquete se almacenan físicamente en el directorio D:\myprogram (en Windows ) o /home/user/myprogram (en Linux ).
La estructura del archivo se ve así:
Cuando invocamos Java, especificamos el nombre de la aplicación a ejecutar: org.mypackage.HelloWorld. Sin embargo, también debemos indicarle a Java dónde buscar los archivos y directorios que definen nuestro paquete. Por lo tanto, para iniciar el programa, usamos el siguiente comando:
dónde:
java
es el lanzador de tiempo de ejecución de Java , un tipo de herramienta SDK (una herramienta de línea de comandos, como javac , javadoc o apt )La variable de entorno nombrada CLASSPATH
también se puede utilizar para establecer la ruta de clase. Para el ejemplo anterior, también podríamos utilizar en Windows:
D:\miprograma> set CLASSPATH = D:\miprograma D:\miprograma> java org.mipaquete.HolaMundo
La regla es que -classpath
la opción, cuando se utiliza para iniciar la aplicación Java, anula la CLASSPATH
variable de entorno. Si no se especifica ninguna, se utiliza el directorio de trabajo actualD:\myprogram\
como ruta de clases. Esto significa que cuando nuestro directorio de trabajo es (en Linux, /home/user/myprogram/
), no necesitaríamos especificar la ruta de clases explícitamente. Sin embargo, al anular, se recomienda incluir la carpeta actual "."
en la ruta de clases en caso de que se desee cargar clases desde la carpeta actual.
Lo mismo se aplica no sólo al lanzador de Java sino también a javac , el compilador de Java.
Si un programa utiliza una biblioteca de soporte incluida en un archivo Jar llamado supportLib.jar , ubicado físicamente en el directorio D:\myprogram\lib\ y la estructura de archivo física correspondiente es:
D:\miprograma\ | ---> biblioteca | ---> soporteLib.jar | ---> org\ | ---> mipaquete\ | ---> HolaMundo.clase ---> Clase de soporte.clase ---> UtilClass.clase
Se necesita la siguiente opción de línea de comando :
java -classpath D:\miprograma;D:\miprograma\lib\supportLib.jar org.mipaquete.HolaMundo
o alternativamente:
D:\miprograma> set CLASSPATH = D:\miprograma;D:\miprograma\lib\supportLib.jar D:\miprograma> java org.mipaquete.HolaMundo
En Java 6 y versiones superiores, se pueden agregar todos los archivos jar en un directorio específico al classpath usando notación comodín.
Ejemplo de Windows:
D:\miprograma> java -classpath ".;c:\milib\*" MiAplicación
Ejemplo de Linux:
$ java -classpath '.:/mylib/*' MiAplicación
Esto funciona tanto para -classpath
opciones como para rutas de clases de entorno.
Si un programa ha sido incluido en un archivo Jar llamado helloWorld.jar , ubicado directamente en el directorio D:\myprogram , la estructura del directorio es la siguiente:
D:\miprograma\ | ---> holaMundo.jar | ---> biblioteca | ---> soporteLib.jar
El archivo de manifiesto definido en helloWorld.jar tiene esta definición:
Clase principal : org.mypackage.HelloWorld Ruta de clase : lib/supportLib.jar
El archivo de manifiesto debe terminar con una nueva línea o un retorno de carro.
El programa se inicia con el siguiente comando:
java -jar D:\myprogram\helloWorld.jar [argumentos de la aplicación]
Esto inicia automáticamente org.mypackage.HelloWorld especificado en la clase Main-Class con los argumentos. El usuario no puede reemplazar este nombre de clase mediante la invocación java -jar
. Class-Path describe la ubicación de supportLib.jar en relación con la ubicación de la biblioteca helloWorld.jar . No se admiten rutas de archivo absolutas, que se permiten en -classpath
el parámetro de la línea de comandos, ni rutas internas de jar. Esto significa que si el archivo de clase principal está contenido en un jar, org/mypackage/HelloWorld.class debe ser una ruta válida en la raíz dentro del jar.
Las entradas de ruta de clase múltiples se separan con espacios:
Ruta de clase : lib/supportLib.jar lib/supportLib2.jar
Al estar estrechamente asociada con el sistema de archivos, la sintaxis de Classpath de la línea de comandos depende del sistema operativo. [1] Por ejemplo:
Esto no se aplica cuando Classpath se define en archivos de manifiesto , donde cada ruta de archivo debe estar separada por un espacio (" "), independientemente del sistema operativo.