Classpath es un parámetro en la máquina virtual de Java o el compilador de Java que especifica la ubicación de las clases y paquetes definidos por el usuario . El parámetro puede establecerse en la línea de comandos o mediante una variable de entorno .
Descripción general y arquitectura
Al igual que en el comportamiento de carga dinámico clásico , al ejecutar programas Java , la máquina virtual Java busca y carga clases de manera perezosa (carga el código de bytes de una clase solo cuando la clase se usa por primera vez). La ruta de clases le dice 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:
- clases bootstrap: las clases que son fundamentales para la plataforma Java (que comprenden las clases públicas de la biblioteca de clases Java y las clases privadas que son necesarias para que esta biblioteca sea funcional).
- clases de extensión: paquetes que están en el directorio de extensión del JRE o JDK , jre / lib / ext /
- paquetes y bibliotecas definidos por el usuario
De forma predeterminada, solo se puede acceder a los paquetes de la API estándar JDK y los paquetes de extensión sin necesidad de establecer dónde encontrarlos. La ruta para 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).
Establecer la ruta para ejecutar programas Java
Suministro como argumento de aplicación
Supongamos que tenemos un paquete llamado org.mypackage que contiene las clases:
- HelloWorld (clase principal)
- SupportClass
- UtilClass
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í:
Microsoft Windows | Linux |
---|---|
D: \ miprograma \ | ---> org \ | ---> mipaquete \ | ---> HelloWorld.class ---> SupportClass.class ---> UtilClass.class | / inicio / usuario / myprogram / | ---> org / | ---> mipaquete / | ---> HelloWorld.class ---> SupportClass.class ---> UtilClass.class |
Cuando invocamos Java, especificamos el nombre de la aplicación a ejecutar: org.mypackage.HelloWorld. Sin embargo, también debemos decirle a Java dónde buscar los archivos y directorios que definen nuestro paquete. Entonces, para lanzar el programa, usamos el siguiente comando:
Microsoft Windows | Linux |
---|---|
java -classpath D: \ myprogram org.mypackage.HelloWorld | java -cp / home / user / myprogram org.mypackage.HelloWorld |
dónde:
java
es el iniciador de tiempo de ejecución de Java , un tipo de herramienta SDK (una herramienta de línea de comandos, como javac , javadoc o apt )- -classpath D: \ myprogram establece la ruta a los paquetes utilizados en el programa (en Linux, -cp / home / user / myprogram ) y
- org.mypackage.HelloWorld es el nombre de la clase principal
Establecer la ruta a través de una variable de entorno
La variable de entorno nombrada CLASSPATH
puede usarse alternativamente para establecer la ruta de clase. Para el ejemplo anterior, también podríamos usar en Windows:
establecer CLASSPATH = D: \ myprogramjava org.mypackage.HelloWorld
La regla es que la -classpath
opción, cuando se utiliza para iniciar la aplicación Java, anula la CLASSPATH
variable de entorno. Si no se especifica ninguno, el directorio de trabajo actual se utiliza como classpath. Esto significa que cuando nuestro directorio de trabajo es D:\myprogram\
(en Linux /home/user/myprogram/
), no necesitaríamos especificar la ruta de clase explícitamente. Sin embargo, al anular, se recomienda incluir la carpeta actual "."
en la ruta de clases en el caso de que se desee cargar clases desde la carpeta actual.
Lo mismo se aplica no solo al lanzador de Java, sino también a javac , el compilador de Java.
Establecer la ruta de un archivo Jar
Si un programa usa 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ísico correspondiente es:
D: \ miprograma \ | ---> lib \ | ---> supportLib.jar | ---> org \ | -> mipaquete \ | ---> HelloWorld.class ---> SupportClass.class ---> UtilClass.class
se necesita la siguiente opción de línea de comandos :
java -classpath D: \ myprogram; D: \ myprogram \ lib \ supportLib.jar org.mypackage.HelloWorld
o alternativamente:
establecer CLASSPATH = D: \ myprogram; D: \ myprogram \ lib \ supportLib.jarjava org.mypackage.HelloWorld
Agregar todos los archivos JAR en un directorio
En Java 6 y versiones posteriores, se pueden agregar todos los archivos jar en un directorio específico a la ruta de clases utilizando la notación comodín.
Ejemplo de Windows:
java -classpath ".; c: \ mylib \ *" MyApp
Ejemplo de Linux:
java -classpath '.: / mylib / *' MyApp
Esto funciona tanto para las -classpath
opciones como para las rutas de clases del entorno.
Establecer la ruta en un archivo de manifiesto
Si un programa se ha incluido en un archivo Jar llamado helloWorld.jar , ubicado directamente en el directorio D: \ myprogram , la estructura del directorio es la siguiente:
D: \ miprograma \ | ---> helloWorld.jar | ---> lib \ | ---> supportLib.jar
El archivo de manifiesto definido en helloWorld.jar tiene esta definición:
Clase principal: org.mypackage.HelloWorldRuta 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 ni la ruta de archivo absoluta, que está permitida en el -classpath
parámetro en la línea de comando, ni las 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.
Varias entradas de classpath se separan con espacios:
Ruta de clase: lib / supportLib.jar lib / supportLib2.jar
Notas específicas del sistema operativo
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:
- en todos los sistemas operativos similares a Unix (como Linux y Mac OS X ), la estructura de directorios tiene una sintaxis Unix, con rutas de archivo separadas separadas por dos puntos (":").
- en Windows , la estructura del directorio tiene una sintaxis de Windows y cada ruta de archivo debe estar separada por un punto y coma (";").
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.
Ver también
- Cargador de clases Java
- Sistema de módulos Java
Referencias
- ^ "El Classpath" . Consultado el 26 de junio de 2016 .
enlaces externos
- Nota que explica cómo se encuentran las clases de Java, en el sitio web de Oracle
- Especificación de cómo configurar Classpath en el sitio de Oracle