G
Gast
Gast
Hallo,
ich möchte eine Anwendung schreiben die mittels Plugins realisiert wird. Ich habe mir das etwa so vorgestellt: Jedes Plugin ist eine Jar-Datei, die sich in einem bestimmten Verzeichnis z.B.: "plugins" befindet. Beim Programmstart sucht das Hauptprogramm nach diesen jar Dateien, deren Inhalt dann nach einer Klasse durchsucht wird, die das "Plugin" Interface implementiert. Wird so eine Klasse gefunden, wird das Plugin initialisiert.
Nun bin ich aber auf 2 Probleme gestoßen:
(1) Da sich in einem Plugin jar-file mehrere Klassen befinden, müsste ich den Classpath irgendwie dynamisch setzen, damit diese Klassen dann auch geladen werden können.
(2) Zu Testzwecken hab ich ein kleines Programm geschrieben und den Classpath mal statisch gesetzt. Das Programm endet jedoch immer mit einer InstantiationException, die auftritt, wenn ein Interface oder eine abstrakte Klasse instantiert werden soll, was aber in meinem Fall nicht sein sollte (glaub ich jedenfalls :wink: )
Hauptprogramm:
Interface:
Plugin:
Wenn ich das Plugin kompiliere, erhalte ich 3 .class - Dateien (MainWindow$1.class, MainWindow$MyActionListener.class und MainWindow.class), die ich dann in ein Jar-File packe.
Wenn ich das Programm dann laufen lasse, dann erhalte ich folgende Meldung:
java.lang.InstantiationException: MainWindow$1
at java.lang.Class.newInstance0(Class.java:335)
at java.lang.Class.newInstance(Class.java:303)
at Application.main(Application.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)
Wie kann ich diese Probleme lösen?
ich möchte eine Anwendung schreiben die mittels Plugins realisiert wird. Ich habe mir das etwa so vorgestellt: Jedes Plugin ist eine Jar-Datei, die sich in einem bestimmten Verzeichnis z.B.: "plugins" befindet. Beim Programmstart sucht das Hauptprogramm nach diesen jar Dateien, deren Inhalt dann nach einer Klasse durchsucht wird, die das "Plugin" Interface implementiert. Wird so eine Klasse gefunden, wird das Plugin initialisiert.
Nun bin ich aber auf 2 Probleme gestoßen:
(1) Da sich in einem Plugin jar-file mehrere Klassen befinden, müsste ich den Classpath irgendwie dynamisch setzen, damit diese Klassen dann auch geladen werden können.
(2) Zu Testzwecken hab ich ein kleines Programm geschrieben und den Classpath mal statisch gesetzt. Das Programm endet jedoch immer mit einer InstantiationException, die auftritt, wenn ein Interface oder eine abstrakte Klasse instantiert werden soll, was aber in meinem Fall nicht sein sollte (glaub ich jedenfalls :wink: )
Hauptprogramm:
Code:
public class Application
{
public static void main(String args[])
{
Object o = null;
String entryName;
try
{
JarFile jarFile = new JarFile("window.jar");
Enumeration jarEntries = jarFile.entries();
while ( jarEntries.hasMoreElements() )
{
entryName = ((JarEntry) jarEntries.nextElement()).getName();
if ( entryName.endsWith(".class") )
{
entryName = entryName.substring(0, entryName.length() - 6);
entryName = entryName.replace('/', '.');
o = Class.forName(entryName).newInstance();
System.out.println(o);
if (o instanceof PlugIn)
{
System.out.println("Found it!");
}
}
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}
Interface:
Code:
public interface PlugIn
{
}
Plugin:
Code:
public class MainWindow extends JFrame implements PlugIn
{
private ActionListener listener;
public MainWindow()
{
listener = new MyActionListener();
}
private class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
}
Wenn ich das Plugin kompiliere, erhalte ich 3 .class - Dateien (MainWindow$1.class, MainWindow$MyActionListener.class und MainWindow.class), die ich dann in ein Jar-File packe.
Wenn ich das Programm dann laufen lasse, dann erhalte ich folgende Meldung:
java.lang.InstantiationException: MainWindow$1
at java.lang.Class.newInstance0(Class.java:335)
at java.lang.Class.newInstance(Class.java:303)
at Application.main(Application.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)
Wie kann ich diese Probleme lösen?