JAR File Nachladen

Wurzelseppi

Mitglied
Hi zusammen,


wie kann man den eine JAR, die man sich während der Laufzeit irgendwo holt (woher sei mal dahingestellt), in den aktuellen Context nachladen, d.h Klassen aus dem Jar - File benutzen ?


Vielen Dank im vorau für zahlreiche Hinweise :-)


Gruß,


Wurzelseppi
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author Tom
 *
 */
public class DynamicLibraryLoadingExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        URL jarURL = new File("E:/eclipse/3.2RC5/eclipse/plugins/org.junit_3.8.1/junit.jar").toURL();
        
        //Entweder so
        //ClassLoader classLoader =    new URLClassLoader(new URL[]{jarURL});
        
        //Oder so
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        if(classLoader != null && (classLoader instanceof URLClassLoader)){
            URLClassLoader urlClassLoader = (URLClassLoader)classLoader;
            Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
            addURL.setAccessible(true);
            addURL.invoke(urlClassLoader, new Object[]{jarURL});
        }
        
        
        Class testRunnerClass = classLoader.loadClass("junit.swingui.TestRunner");
        testRunnerClass.getMethod("main", new Class[]{String[].class}).invoke(null, new Object[]{new String[0]});
        
    }
}

Gruß Tom
 
Vielen Dank Thomas, hast mir damit sehr geholfen :)

Hatte ziemliche probleme mit dem urlclassloader in ner schleife, weil er wohl beim erneuten aufruf sich immer ans parent, also den classloader appsclassloader oder so, gewandt hat (stichwort "unloading class" :()

Aber jetzt t es endlich, das alle jar's in nem lib verzeichnis ausgelesen und die klassen darin geladen werden, wenn man das programm startet.
 
Ist der Code so noch aktuell? ist immerhin nen paar Jahre alt.
Wenn ja würde es mich freuen wenn mir jemand den Code erklären bzw. kommentieren würde. Besonders der unterste Teil ist für mich noch ein Fragezeichen.

Gruss
cyberdragon
 
ich habe zwar den Code jetzt icht ausprobiert, aber die letzten beiden Zeilen scheinen die Main-Routine einer Testklasse zu starten.
 
Jo, aber nur beispielhaft um zu zeigen, dass die Klasse geladen wurde. Der Code ist immer noch vollständig korrekt und auch die inoffizielle Methode einem Classloader weitere JARs bekannt zu machen. Inoffiziell deshalb, weil der Reflectionhack schon arg bös ist. ;)

REINHAUN!
 
>>Inoffiziell deshalb, weil der Reflectionhack schon arg bös ist.
Warum genau ist die Methode (addUrl) eigentlich nicht public bzw. böse?
 
Zurück