# JAR File Nachladen



## Wurzelseppi (31. Mai 2006)

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


----------



## Thomas Darimont (31. Mai 2006)

Hallo!

Schau mal hier:

```
/**
 * 
 */
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


----------



## Sicky (7. Januar 2008)

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.


----------



## cyb3rdragon (6. August 2008)

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


----------



## takidoso (6. August 2008)

ich habe zwar den Code jetzt icht ausprobiert, aber die letzten beiden Zeilen scheinen die Main-Routine einer Testklasse zu starten.


----------



## Oliver Gierke (6. August 2008)

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!


----------



## takidoso (7. August 2008)

dann würde mich die offizielle Variante mal interessieren.


----------



## Oliver Gierke (7. August 2008)

Benutz OSGi 

REINHAUN!


----------



## Thomas Darimont (7. August 2008)

Hallo,

ab Java 6  könntest du das auch über den ServiceLoader realisieren:
http://www.tutorials.de/forum/java/310207-eine-art-plugin-system-2.html

Gruß Tom


----------



## benhaze (9. August 2008)

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


----------

