Java Language
El classpath
Buscar..
Introducción
Observaciones
Carga de clases de Java
La JVM (Java Virtual Machine) cargará las clases a medida que se requieran las clases (esto se denomina carga lenta). Las ubicaciones de las clases que se utilizarán se especifican en tres lugares:
- Los requeridos por la plataforma Java se cargan primero, como los de la biblioteca de clases de Java y sus dependencias.
- Las clases de extensión se cargan a continuación (es decir, aquellas en
jre/lib/ext/
) - Luego se cargan las clases definidas por el usuario a través del classpath.
Las clases se cargan utilizando clases que son subtipos de java.lang.ClassLoader
. Esto se describe con más detalle en este tema: Cargadores de clases .
Classpath
El classpath es un parámetro utilizado por la JVM o compilador que especifica las ubicaciones de las clases y los paquetes definidos por el usuario. Esto se puede establecer en la línea de comandos como en la mayoría de estos ejemplos o mediante una variable de entorno ( CLASSPATH
)
Diferentes formas de especificar el classpath.
Hay tres formas de configurar el classpath.
Se puede configurar utilizando la variable de entorno
CLASSPATH
:set CLASSPATH=... # Windows and csh export CLASSPATH=... # Unix ksh/bash
Se puede configurar en la línea de comando de la siguiente manera
java -classpath ... javac -classpath ...
Tenga en cuenta que la
-classpath
(o-cp
) tiene prioridad sobre la variable de entornoCLASSPATH
.La ruta de
Class-Path
para un archivo JAR ejecutable se especifica mediante el elementoClass-Path
enMANIFEST.MF
:Class-Path: jar1-name jar2-name directory-name/jar3-name
Tenga en cuenta que esto solo se aplica cuando el archivo JAR se ejecuta así:
java -jar some.jar ...
En este modo de ejecución, la opción
-classpath
y la variable de entorno CLASSPATH se ignorarán, incluso si el archivo JAR no tiene ningún elementoClass-Path
.
Si no se especifica ninguna ruta de clase, entonces la ruta de java -jar
predeterminada es el archivo JAR seleccionado cuando se utiliza java -jar
, o el directorio actual de lo contrario.
Relacionado:
- https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
- http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
Agregando todos los JARs en un directorio a la ruta de clase
Si desea agregar todos los archivos JAR en el directorio a la ruta de clase, puede hacer esto de manera concisa usando la sintaxis de comodín de la ruta de clase; por ejemplo:
someFolder/*
Esto le indica a la JVM que agregue todos los archivos JAR y ZIP en el directorio someFolder
a la ruta de someFolder
. Esta sintaxis se puede usar en un argumento -cp
, una variable de entorno CLASSPATH
o un atributo Class-Path
en el archivo de manifiesto de un archivo JAR ejecutable. Consulte Configuración de la ruta de clase: comodines de ruta de clase para ver ejemplos y advertencias.
Notas:
- Los comodines de Classpath se introdujeron por primera vez en Java 6. Las versiones anteriores de Java no tratan a "*" como un comodín.
- No puede poner otros caracteres antes o después de " "; por ejemplo, "someFolder / .jar" no es un comodín.
- Un comodín coincide solo con archivos con el sufijo ".jar" o ".JAR". Los archivos ZIP se ignoran, al igual que los archivos JAR con sufijos diferentes.
- Un comodín solo coincide con los archivos JAR en el directorio, no en sus subdirectorios.
- Cuando un grupo de archivos JAR coincide con una entrada de comodín, no se especifica su orden relativo en la ruta de clase.
Sintaxis de ruta de clase
La ruta de clase es una secuencia de entradas que son nombres de ruta de directorio, nombres de ruta de archivos JAR o ZIP o especificaciones de comodín JAR / ZIP.
Para una ruta de clase especificada en la línea de comando (por ejemplo,
-classpath
) o como una variable de entorno, las entradas deben estar separadas con;
(punto y coma) en Windows, o:
(dos puntos) en otras plataformas (Linux, UNIX, MacOSX, etc.).Para el elemento
Class-Path
enMANIFEST.MF
un archivo JAR, use un solo espacio para separar las entradas.
A veces es necesario incrustar un espacio en una entrada classpath
Cuando se especifica la ruta de clase en la línea de comando, es simplemente una cuestión de usar la comilla de shell apropiada. Por ejemplo:
export CLASSPATH="/home/user/My JAR Files/foo.jar:second.jar"
(Los detalles pueden depender del comando shell que utilice).
Cuando la ruta de clase se especifica en un archivo JAR, un archivo "MANIFEST.MF", se debe utilizar la codificación de URL.
Class-Path: /home/user/My%20JAR%20Files/foo.jar second.jar
Classpath dinámico
A veces, solo agregar todos los archivos JAR desde una carpeta no es suficiente, por ejemplo, cuando tiene un código nativo y necesita seleccionar un subconjunto de archivos JAR. En este caso, necesitas dos métodos main()
. El primero construye un cargador de clases y luego usa este cargador de clases para llamar al segundo main()
.
Este es un ejemplo que selecciona el JAR nativo SWT correcto para su plataforma, agrega todos los JAR de su aplicación y luego invoca el método main()
real: Cree una aplicación SWT Java multiplataforma
Cargar un recurso desde el classpath
Puede ser útil cargar un recurso (imagen, archivo de texto, propiedades, KeyStore, ...) que está empaquetado dentro de un JAR. Para este propósito, podemos usar los Class
y ClassLoader
s.
Supongamos que tenemos la siguiente estructura de proyecto:
program.jar
|
\-com
\-project
|
|-file.txt
\-Test.class
Y queremos acceder al contenido de file.txt
desde la clase Test
. Podemos hacerlo preguntando al cargador de clases:
InputStream is = Test.class.getClassLoader().getResourceAsStream("com/project/file.txt");
Al usar el cargador de clases, necesitamos especificar la ruta de acceso completa de nuestro recurso (cada paquete).
O alternativamente, podemos preguntar directamente al objeto de la clase Test.
InputStream is = Test.class.getResourceAsStream("file.txt");
Usando el objeto de clase, la ruta es relativa a la clase en sí. Test.class
estar nuestro Test.class
en el paquete com.project
, al igual que file.txt
, no necesitamos especificar ninguna ruta.
Sin embargo, podemos usar rutas absolutas desde el objeto de clase, de esta manera:
is = Test.class.getResourceAsStream("/com/project/file.txt");
Asignación de nombres de clases a rutas de acceso
La cadena de herramientas estándar de Java (y las herramientas de terceros diseñadas para interactuar con ellas) tienen reglas específicas para asignar los nombres de las clases a las rutas de los archivos y otros recursos que los representan.
Las asignaciones son las siguientes
- Para las clases en el paquete predeterminado, las rutas de acceso son nombres de archivos simples.
- Para las clases en un paquete con nombre, los componentes del nombre del paquete se asignan a directorios.
- Para las clases anidadas e internas nombradas, el componente de nombre de archivo se forma al unir los nombres de clase con un carácter
$
. - Para las clases internas anónimas, los números se utilizan en lugar de los nombres.
Esto se ilustra en la siguiente tabla:
Nombre de la clase | Fuente de acceso | Nombre de archivo |
---|---|---|
SomeClass | SomeClass.java | SomeClass.class |
com.example.SomeClass | com/example/SomeClass.java | com/example/SomeClass.class |
SomeClass.Inner | (en SomeClass.java ) | SomeClass$Inner.class |
SomeClass clases internas de anon | (en SomeClass.java ) | SomeClass$1.class , SomeClass$2.class , etc. |
Qué significa el classpath: cómo funcionan las búsquedas
El propósito del classpath es decirle a una JVM dónde encontrar clases y otros recursos. El significado de la ruta de clase y el proceso de búsqueda están entrelazados.
El classpath es una forma de ruta de búsqueda que especifica una secuencia de ubicaciones para buscar recursos. En una ruta de clase estándar, estos lugares son un directorio en el sistema de archivos del host, un archivo JAR o un archivo ZIP. En cada caso, la ubicación es la raíz de un espacio de nombres que se buscará.
El procedimiento estándar para buscar una clase en el classpath es el siguiente:
Asigne el nombre de la clase a un archivo de clase relativo nombre de ruta
RP
. La asignación de nombres de clase a nombres de archivo de clase se describe en otra parte.Para cada entrada
E
en el classpath:- Si la entrada es un directorio de sistema de archivos:
- Resuelva el
RP
relativo aE
para dar unAP
nombre de ruta absoluto. - Probar si
AP
es una ruta para un archivo existente. - Si es así, cargue la clase de ese archivo
- Resuelva el
- Si la entrada es un archivo JAR o ZIP:
- Busque
RP
en el índice de archivos JAR / ZIP. - Si existe la entrada del archivo JAR / ZIP correspondiente, cargue la clase de esa entrada.
- Busque
- Si la entrada es un directorio de sistema de archivos:
El procedimiento para buscar un recurso en la ruta de clase depende de si la ruta del recurso es absoluta o relativa. Para una ruta de recursos absoluta, el procedimiento es el anterior. Para una ruta de recursos relativa resuelta utilizando Class.getResource
o Class.getResourceAsStream
, la ruta para el paquete de clases se añade antes de la búsqueda.
(Tenga en cuenta que estos son los procedimientos implementados por los cargadores de clases Java estándar. Un cargador de clases personalizado podría realizar la búsqueda de manera diferente).
La ruta de clases de arranque
Los cargadores de clases de Java normales buscan clases primero en la ruta de clase de rutina de carga, antes de verificar las extensiones y la ruta de clase de la aplicación. De forma predeterminada, la ruta de clase de arranque consta del archivo "rt.jar" y algunos otros archivos JAR importantes que se suministran con la instalación de JRE. Estos proporcionan todas las clases en la biblioteca de clases estándar de Java SE, junto con varias clases de implementación "internas".
En circunstancias normales, no necesita preocuparse por esto. De forma predeterminada, los comandos como java
, javac
, etc. usarán las versiones apropiadas de las bibliotecas de tiempo de ejecución.
Muy ocasionalmente, es necesario anular el comportamiento normal del tiempo de ejecución de Java utilizando una versión alternativa de una clase en las bibliotecas estándar. Por ejemplo, puede encontrar un error "show stopper" en las bibliotecas de tiempo de ejecución que no puede solucionar por medios normales. En tal situación, es posible crear un archivo JAR que contenga la clase modificada y luego agregarlo a la ruta de clases de arranque que inicia la JVM.
El comando java
proporciona las siguientes opciones -X
para modificar la ruta de clase de arranque:
-
-Xbootclasspath:<path>
reemplaza la-Xbootclasspath:<path>
inicio actual con la ruta proporcionada. -
-Xbootclasspath/a:<path>
agrega la ruta de acceso proporcionada a la ruta de clase de arranque actual. -
-Xbootclasspath/p:<path>
antepasa la ruta proporcionada a la-Xbootclasspath/p:<path>
clase de arranque actual.
Tenga en cuenta que cuando utiliza las opciones de la ruta de inicio para reemplazar o anular una clase de Java (etcétera), técnicamente está modificando Java. Puede haber implicaciones de licencia si luego distribuye su código. (Consulte los términos y condiciones de la licencia binaria de Java ... y consulte a un abogado).