Wednesday, August 30, 2006

[JAVA] Obtener el classpath en tiempo de ejecución

Cuando trabajas en java se maneja el concepto de classpath, entendamos primero el concepto antes de entrar al tema:

El classpath es el conjunto de rutas (ubicaciones) a las que tiene acceso el sistema operativo (p.ej: 'C:\Documents and settings\Mi Sesión') y donde el JVM (java virtual machine) puede encontrar byte code (.class que son los generados al compilar fuentes de java). La funcionalidad es similar a la variable de entorno 'PATH' de windows y linux.

Al ejecutar una aplicación de java es común encontrar líneas de ejecución como esta:

java -classpath IconosSC.jar;bin\OtroJar.jar; Paquete.Main

donde se está agregando al classpath del JVM el jar IconosSC.jar, el jar dentro de la carpeta bin con nombre OtroJar.jar y finalmente el nombre de la clase que iniciará la ejecución del programa que lleva el nombre de Main.

Ahora, que ocurre si queremos ver los directorios del classpath en tiempo de ejecución?, simple: Existe una clase estática llamada: ClassLoader, el concepto de cargador de clases puede dar tema a otro tópico para el blog, pero por el momento diremos que es el encargado de levantar las clases en el JVM, veamos las siguientes instrucciones:

import java.net.*;
URLClassLoader Cargador = (URLClassLoader)ClassLoader.getSystemClassLoader();
URL[] cjto = Cargador.getURLs();
System.err.println("Classpath size: " + cjto.length);
for (int i=0; i < cjto.length; i++)

System.err.println(i + " " + cjto[i].toString());


Las clases utilizadas se encuentran en java.net, como veras, el ClassLoader nos permite obtener el cargador de clases del sistema, devolviendonos una instancia de URLClassLoader a través del método 'getSystemClassLoader', luego podemos obtener los URL's (path's) en objetos URL que también se encuentran en java.net. Esto nos da muchas posibilidades si lo que buscamos es trabajar con el classpath, como por ejemplo si quisieramos agregar un jar en tiempo de ejecución, pero eso será otro tema para el blog!.

8 Comments:

At 7:25 AM, Blogger Nelmol said...

Hola Cesar, vivo en Madrid - España y tu ejemplo me ha servido de mucha ayuda. Mil gracias.

Nelmol

 
At 3:16 PM, Blogger Cesar Cayetano said...

Para cargar un jar en tiempo de ejecución tienes que agregar el URL del archivo al ClassLoader de la máquina virtual, para hacer esto debes obtener la instancia del URLClassLoader de la siguiente manera:

URLClassLoader cargadorJVM = (URLClassLoader)ClassLoader.getSystemClassLoader();

La idea es llamar al método protegido de esa instancia de nombre 'addURL'. Debido a que es protegido debemos hacer un llamado indirecto de forma dinámica (en ésta sección 'ruta' es una cadena con la ubicación del archivo jar que deseas agregar):

Class claseJVM = URLClassLoader.class;
Class params[] = new Class[]{ URL.class };

try{
File objFile = new File(ruta);
Method metodo = claseJVM.getDeclaredMethod("addURL", params);

//esta linea es para volver accesible el método
metodo.setAccessible(true);
URL objUrl = objFile.toURL();

metodo.invoke(cargadorJVM, new Object[]{ objUrl });

}catch(Throwable th){
throw new IOException("Error");
}

De esa forma ya puedes acceder a los contenidos del jar, Saludos.

 
At 7:38 PM, Anonymous Anonymous said...

felicitaciones doctor, le está haciendo ud. un bien a la comunidad. sigue adelante con el blog!

 
At 7:42 AM, Anonymous Anonymous said...

Muchas gracias por el artículo.

Un saludo

 
At 8:36 AM, Anonymous Anonymous said...

Sólo añadir un detalle para el que lo quiera utilizar. El método Method es del paquete java.lang.reflect

Un saludo

 
At 7:36 AM, Anonymous Anonymous said...

Mi problema es que quiero cargar una libreria por ejemplo joPAS.jar, para poder usarla en mi programa, lo que uso es GNU/Linux, para esto la copio en el directorio donde estan las demas librerias, y en el NetBeans voy a tools->library manager->Absolutelayout y la cargo, pero despues no se como llamarla desde el programa.

saludos
angel borjas

 
At 9:57 PM, Anonymous Anonymous said...

Hola, ¿esto también me serviría para hacer un splash screen que vaya mostrando las clases que se van cargando cuando esta arrancando la aplicación?.

 
At 4:25 AM, Anonymous Raul Barahona (raulbcneo#gmail.com) said...

Hola a todos,

también se puede lanzar la aplicación java con la opción -verbose:class. Por ejemplo:

java -verbose:class MiProgramaJava

Con esta opción se muestran en pantalla las librerías que se cargan dinámicamente en la ejecución del programa sin tener que escribir el código de César.

 

Post a Comment

<< Home