Comment charger un jar lors de l'exécution d'un programme Java

Publié le 10 Mai 2012

Charger un nouveau jar dynamiquement lors de l'exécution du programme n'est pas aussi simple qu'il y paraît.

En effet le classpath de l'application est déterminé au lancement du programme. Il est accessible au travers du ClassLoader système qu'on peut récupérer de la manière suivante:

ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

Le ClassLoader système est en fait un URLClassLoader on peut donc effectuer un cast:

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

Ensuite la difficulté va être d'appeler la méthode addURL() qui est protected, ce qui veut dire qu'elle n'est accessible que depuis une sous-classe.

Hors on ne peut pas remplacer (enfin je crois) le ClassLoader système, donc je ne souhaite pas partir dans cette direction qui m'obligerai à changer les appels à Class.forName() en précisant le ClassLoader à utiliser.

En fait on peut utiliser la réfection pour invoquer addURL() sur le ClassLoader système directement:

URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
try{
   URL url = new File("./maBibliotheque.jar").toURI().toURL();
   Method addURL = URLClassLoader.class.getDeclaredMethod("addURL"new Class<?>[]{URL.class}); 
   addURL.setAccessible(true);
   addURL.invoke(systemClassLoader, new Object[]{url});
}
catch(Exception e){
   e.printStackTrace();
}

Rédigé par Bliz

Publié dans #Java

Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article