Je suis en train d'utiliser URLClassLoader pour charger des jars à l'exécution à partir d'une URL de serveur (disons : http://jarsToBeLoaded/jars/
). Je charge commons-collection.jar
, commons-httpclient.jar
et commons-io.jar
, par exemple. Ma question est : ces jars sont-ils téléchargés dès que j'appelle addURL()
pour chaque jar ou dès que j'instancie une classe qui est utilisée dans l'un de ces jars (paresseux) ?
Réponse
Trop de publicités?From what I can tell, the behavior is not specified, so it will depend on your JVM how the URLs are treated. I have looked through the code of Open JDK 8u40. For that implementation there is no downloading of Jars when addUrl()
is called. The call is delegated to sun.misc.URLClassPath
for which you can see the implementation here:
public synchronized void addURL(URL url) {
if (closed)
return;
synchronized (urls) {
if (url == null || path.contains(url))
return;
urls.add(0, url);
path.add(url);
if (lookupCacheURLs != null) {
// The lookup cache is no longer valid, since getLookupCache()
// does not consider the newly added url.
disableAllLookupCaches();
}
}
}
Toute la magie du chargement des classes à partir de vos fichiers Jar se produira lorsque vous essayez de charger vos classes dans ces jars, en utilisant votre propre classloader, pour la première fois et java.net.URLClassLoader.findClass
sera appelé. Je ne suis pas sûr si les Jars seront effectivement téléchargés et mis en cache quelque part ou si le JVM travaillera avec des flux réseau tout le temps - le code URLClassPath
n'est pas facile à suivre...