Plugin System

flux

Mitglied
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.

Java:
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 ;)
 
S

SlaterB

Gast
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
Java:
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

Mitglied
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?
 

Ähnliche Java Themen

Neue Themen


Oben