2010-04-10 10 views

Répondre

6

C'est peu probable, comme vous le constaterez si vous essayez de le faire vous-même. Vous ne serez pas en mesure d'accéder au hasard à un InputStream pour rechercher des classes comme elles sont demandées, donc vous devrez mettre en cache le contenu soit en mémoire soit dans le système de fichiers.

Si vous mettez en cache sur le disque, utilisez simplement URLClassLoader.

Si vous mettez en cache en mémoire, vous devrez créer une sorte de Map avec JarInputStream puis étendre ClassLoader (remplaçant les méthodes appropriées). L'inconvénient de cette approche est que vous gardez les données dans la RAM inutilement.

0

Je sais que ce n'est pas vraiment une réponse à votre question concernant JAR/InputStream. Mais ce qui suit peut être une solution alternative à ce que vous essayez d'atteindre. Voici un code qui va ajouter une URL à classpath.

Vous pouvez convertir un java.io.File à URL comme f.toURI().toURL()

/** 
* Adds a URL to current classpath. 
* @param url url 
*/ 
public static void addURL(URL u) {  
    URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader(); 
    try { 
     Method method = URLClassLoader.class.getDeclaredMethod("addURL",parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader,new Object[]{u}); 
     System.out.println("Dynamically added " + u.toString() + " to classLoader"); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
}