# Plugin System



## flux (6. Jan 2010)

Hallo zusammen.

Ich habe folgendes Problem.
Ich möchte ein kleines Plugin System erstellen.
Dazu habe ich ein Interface "Plugin" erstellt. Dieses Interface wird von einem Plugin implementiert.
Das Plugin ist in einer jar Datei. Geladen wird das Plugin mit dem Classloader.
In einer normalen Java Anwendung funktioniert das auch.
Lasse ich das ganze aber in einer Web Anwendung laufen, bekomme ich eine ClassNotFoundException, dass die Klasse "Plugin", also mein Interface, nicht gefunden wird.


```
private List<Plugin> getPlugins(final File file) {
      List<Plugin> plugins = new ArrayList<Plugin>();

      JarInputStream input = null;
      try {
         input = new JarInputStream(new FileInputStream(file));

         JarEntry entry = null;
         while ((entry = input.getNextJarEntry()) != null) {
            String name = entry.getName();
            if (name.endsWith(".class")) {
               name = name.substring(0, name.length() - 6);
               name = name.replace("/", ".");
               URL url = file.toURI().toURL();
               URLClassLoader loader = new URLClassLoader(new URL[] { url });

               final Class pluginClass = loader.loadClass(name);

               Class[] interfaces = pluginClass.getInterfaces();
               if (interfaces != null) {
                  for (Class interfaceClass : interfaces) {
                     if (interfaceClass.getName()
                           .equals(Plugin.class.getName())) {

                        Plugin plugin= (Plugin)pluginClass.newInstance();
                        plugins.add(widget);
                     }
                  }
               }

            }
         }

      } catch (..) {
      } finally {
         if (input != null) {
            try {
               input.close();
            } catch (..) {
            }
         }
      }

      return plugins;
   }
```

Die jar Datei und deren Klassen werden gefunden. Nur das "Plugin" Interface nicht.

Ich hoffe ihr könnte mir helfen


----------



## SlaterB (6. Jan 2010)

bist du sicher, dass nicht eher die Plugin-Klasse nicht gefunden wird?
> final Class pluginClass = loader.loadClass(name);

ob eine beim Kompilieren bekannte Klasse normal gefunden wird, testet man doch eher mit Code wie

```
public class Test
{
    public static void main(String[] args)
    {
        System.out.println(Plugin.class.getName());
    }
}
```

--------

um auszuschließen, dass der Server nicht doch irgendwie nur alte Klassen/ Jars kennt,
am besten noch eine zweite neue Klasse erfinden und testen
sowie vorhandene Klassen verändern, z.B. eine statische Variable einfügen und die im laufenden Programm ausgeben


----------



## flux (6. Jan 2010)

Anscheinend lag es an den alten Jars. Danke :toll:

Jetzt habe ich aber ein anderes Problem.
Das Web Projekt arbeitet mit dem Zk Framework.
In der Plugin-Klasse möchte ich auch auf die Komponenten des Frameworks zugreifen.
Muss ich die libs dann einmal im WEB-INF/lib Verzeichnis der war Datei haben und in dem Verzeichnis mit den Plugin Jars? 
Eine andere Möglichkeit wäre die Plugins mit in die war Datei zu integrieren. Dann müsste man halt jedes Mal ein neues war Archiv erstellen.

Wie würde man das denn am Besten lösen?


----------

