# Dynamisches Nachladen von JARs (Plugin)



## Caramoon (28. Sep 2006)

*Problematik:*
Meine Datei "_Beipiel.jar_" liegt im Ordner "_bin/plugin_" und enthält die Klasse "_Beispiel.Example.class_".
Das Problem ist, dass sich die _Example _Klasse zur Laufzeit nicht finden lässt.

Es wird immer eine _ClassNotFoundException_ ausgegeben.

Die Pathangaben habe ich schon in allen Variationen durchgespielt. Dort kann der Fehler also nicht liegen.
Kopiere ich die Klasse einfach nur ins Verzeichnis funktioniert es sogar.
ALSO WIE KANN ICH DIE JAR FILE DYNAMISCH EINBINDEN (import geht ja nicht!)???

*Quelltextausschnitt:*

```
...
static AbstractDocument ACTIVE_DOCUMENT;
...
public static void doNewDocument(String type) {
   try {
      ACTIVE_DOCUMENT = (AbstractDocument) newInstance("bin/plugin/",
      "Beispiel.Document");
   } catch (Exception e) {
      e.printStackTrace();
   }
}

protected static Object newInstance(String path, String classname)
      throws Exception {
   URL url = new File(path).toURI().toURL();
   URLClassLoader cl = new URLClassLoader(new URL[] { url });
   Class<?> c = cl.loadClass(classname);		
   return c.newInstance();
}
...
```
[/list]


----------



## Woody (4. Jan 2008)

Hallo,
ich habe das gleiche Problem, dass ich Klassen dynamisch zur Laufzeit hinzufügen will.
Ich arbeite an einem Programm welches über Plugins, in Form von jar Containern, verschiedene Funktionen einbinden soll. Jenachdem wie viele Plugins im entsprechenden Ordner sind, soll von jeder enthaltenen Klasse eine neue Instance gebildet werden und im Hauptprogramm ein neuer Reiter im JTabbedPane eingefügt werden, dessen Inhalt im Plugin festgelegt ist.
Frage gibt es hier im Forum schon irgendwo ne Lösung (meine Suche blieb erfolglos) oder hat jemand ne Lösung?
Danke im voraus!


----------



## Illuvatar (4. Jan 2008)

Deine path-Variable muss den Pfad zur jar-Datei, nicht zu dem Ordner enthalten


----------



## Woody (9. Jan 2008)

Danke, es funktioniert jetzt Klassen zur Laufzeit einzubinden.
Jedoch hab ich noch ein weiteres Problem. In den jar-Files soll sich außerdem eine Propertiesdatei befinden, welche ich auslesen möchte. Ich bekomme nur leider immer eine Fehlermeldung java.io.FileNotFoundException für die config.properties


```
public void loadPlugins() {
   Properties config = new Properties();
   File dir = new File(pluginDir);
   String[] plugins = dir.list();
   for ( int i = 0; i < (plugins.length); i++) {
     String plugin = pluginDir + plugins[i];
     String conf = plugin + "/" + "config.properties";
     System.out.println("Hier der Pfad zur config: " + conf);
     try {
       config.load(new FileInputStream(conf));
       System.out.println("Die Conf wurde eingeladen");
    } catch (Exception e1) {
      System.out.println("Fehler");
      e1.printStackTrace();
    }
    String classname = config.getProperty("classname");
    try {
      Object panel = getPlugin(pluginDir, classname );
      fillTabbedPane(panel,config);
    } catch (Exception e) {
      System.out.println("ERROR: Could not load the Plugin: " + e.toString());
      return;
    }
  }
}
```
Falls ich die *.class und die config.properties in einen einfachen ordner lege funtkioniert alles. Frage also: muss ich noch etwas beachten, wenn ich ne datei aus der jar einlesen möchte?


----------

