Quelques remarques générales:
vous ne pouvez pas (de façon portable qui est garanti de fonctionner, voir ci-dessous) changer le système classpath. Au lieu de cela, vous devez définir un nouveau chargeur de classe.
Chargeurs de classes travaillent dans une manière hiérarchique... de sorte que toute la classe qui fait une référence statique de la classe X qui doit être chargé dans le même chargeur de classe X, ou dans un chargeur de classe de l'enfant. Vous ne pouvez PAS utiliser ClassLoader personnalisé afin de rendre le code chargé par le système de chargeur de classe lien correctement, si il n'aurait pas fait avant. Si vous avez besoin pour organiser votre principale de l'application du code à exécuter dans le ClassLoader personnalisé en plus le code supplémentaire que vous recherchez.
(Cela dit, fissuré de toutes les citations dans les commentaires de cet exemple de l'extension de l' URLClassLoader
)
Et vous pouvez envisager de ne pas écrire votre propre chargeur de classe, mais il suffit d'utiliser URLClassLoader à la place. Créer un URLClassLoader avec une url qui ne sont pas dans les chargeurs de classes parent url.
URL[] url={new URL("file://foo")};
URLClassLoader loader = new URLClassLoader(url);
Une solution plus complète serait:
ClassLoader currentThreadClassLoader
= Thread.currentThread().getContextClassLoader();
// Add the conf dir to the classpath
// Chain the current thread classloader
URLClassLoader urlClassLoader
= new URLClassLoader(new URL[]{new File("mtFile").toURL()},
currentThreadClassLoader);
// Replace the thread classloader - assumes
// you have permissions to do so
Thread.currentThread().setContextClassLoader(urlClassLoader);
Si vous assumez la Jvm système de chargeur de classe est un URLClassLoader (qui peut ne pas être vrai pour toutes les machines virtuelles), vous pouvez utiliser la réflexion ainsi de réellement modifier le système classpath... (mais c'est un hack;)):
public void addURL(URL url) throws Exception {
URLClassLoader classLoader
= (URLClassLoader) ClassLoader.getSystemClassLoader();
Class clazz= URLClassLoader.class;
// Use reflection
Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(classLoader, new Object[] { url });
}
addURL(new File("conf").toURL());
// This should work now!
Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");