Hi,
ich habe folgendes Problem:
Ich habe ein Plugin Fähiges System entwickelt.
Ich habe eine Starter Klasse geschrieben, welche die main Funktion beinhaltet.
Diese Starter Klasse lädt aus einem Plugin Ordner alle dort befindlichen Plugins und führt sie aus.
Damit ein Dritter ein Plugin schreiben kann, habe ich eine Api.jar erstellt die das notwendige Interface "ExternalFunction" enthält, welches alle Plugins implementieren müssen.
Nachdem ein Dritter nun ein Klasse geschrieben hat, welche das Interface implementiert, kompiliert er dieses.
Dazu gibt er beispielsweise auf der Windows Konsole folgendes ein:
javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
Anschließend packt man die MyPlugin.class Datei die man hieraus erhält in ein jar-Archiv und diese legt man in den Plugin Ordner.
Beim Starten des Programm mit der main Function wird nun das Plugin geladen.
Die Starter Klasse mit der Main Funktion habe ich in Eclipse geschrieben. Dieses verwendet JRE 1.6.
Das Problem: Führe ich in Eclipse die Starter Klasse aus, so funktioniert alles wunderbar, wenn das von einem Dritten geschrieben Plugin mit einem JDK der Version 1.6 kompiliert wurde.
Das in der Api.jar geschrieben Interface welches ich dem Dritten mitliefer wurde von mir auc über das JDK der Version 1.6 kompiliert.
Hat der Dritte aber sein Plugin mit einem JDK der Version 1.7 kompiliert und führt, dann das Hauptprogramm aus, dann kommt es zu einer:
Exception in thread "main" java.lang.UnsupportedClassVersionError: MyPlugin : Unsupported major.minor version 51.0
Sprich:
C:\Program Files\Java\jdk1.6.0_29\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Das Hauptprogramm wird beim Laden der Klasse KEINEN java.lang.UnsupportedClassVersionError werfen)
C:\Program Files\Java\jdk1.7.0_01\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Hierbei wird nachher beim Laden der Klasse ein java.lang.UnsupportedClassVersionError geworfen)
Hierhin sehe ich aber ein Problem für die späteren Plugin Entwickler. Denn es kommen ja immer wieder
mal neue Version des JDK heraus. Und ich denke mal, nicht dass ein Entwickler alle JDK Versionen auf seinem Rechner haben wird sondern in der Regel die neueste.
Um aber ein Plugin für meine Hauptprogramm schrieben zu können muss er offensichtlich eine JDK der Version 1.6 verwenden ansonsten kommt es zur oben genannten Exception.
Irgendwie verstehe ich dieses Konzept aber nicht, denn ich fänds irgendwie logischer wenn die Plugins die mit JDK 1.7 oder höher entwickelt wurden abwärtskompatibel sein sollten, und nicht unbedingt mit JDK 1.6 zu entwickeln sind. Dem ist halt aber nicht so.
Muss ich dem Dritten jetzt also jedes mal die JDK Version 1.6 mitgeben damit er seine PluginKlasse kompilieren kann, bzw. muss ich ihm sagen dass er sich diese JDK Version runterladen muss, damit später keine Exception geworden werden.
ich habe folgendes Problem:
Ich habe ein Plugin Fähiges System entwickelt.
Ich habe eine Starter Klasse geschrieben, welche die main Funktion beinhaltet.
Diese Starter Klasse lädt aus einem Plugin Ordner alle dort befindlichen Plugins und führt sie aus.
Damit ein Dritter ein Plugin schreiben kann, habe ich eine Api.jar erstellt die das notwendige Interface "ExternalFunction" enthält, welches alle Plugins implementieren müssen.
Code:
Api.jar
|----------> META-INF
| |----------> MANIFEST.MF
|
|----------> interfaces
|----------> ExternalFunction.class
Nachdem ein Dritter nun ein Klasse geschrieben hat, welche das Interface implementiert, kompiliert er dieses.
Dazu gibt er beispielsweise auf der Windows Konsole folgendes ein:
javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
Anschließend packt man die MyPlugin.class Datei die man hieraus erhält in ein jar-Archiv und diese legt man in den Plugin Ordner.
Beim Starten des Programm mit der main Function wird nun das Plugin geladen.
Die Starter Klasse mit der Main Funktion habe ich in Eclipse geschrieben. Dieses verwendet JRE 1.6.
Das Problem: Führe ich in Eclipse die Starter Klasse aus, so funktioniert alles wunderbar, wenn das von einem Dritten geschrieben Plugin mit einem JDK der Version 1.6 kompiliert wurde.
Das in der Api.jar geschrieben Interface welches ich dem Dritten mitliefer wurde von mir auc über das JDK der Version 1.6 kompiliert.
Hat der Dritte aber sein Plugin mit einem JDK der Version 1.7 kompiliert und führt, dann das Hauptprogramm aus, dann kommt es zu einer:
Exception in thread "main" java.lang.UnsupportedClassVersionError: MyPlugin : Unsupported major.minor version 51.0
Sprich:
C:\Program Files\Java\jdk1.6.0_29\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Das Hauptprogramm wird beim Laden der Klasse KEINEN java.lang.UnsupportedClassVersionError werfen)
C:\Program Files\Java\jdk1.7.0_01\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Hierbei wird nachher beim Laden der Klasse ein java.lang.UnsupportedClassVersionError geworfen)
Hierhin sehe ich aber ein Problem für die späteren Plugin Entwickler. Denn es kommen ja immer wieder
mal neue Version des JDK heraus. Und ich denke mal, nicht dass ein Entwickler alle JDK Versionen auf seinem Rechner haben wird sondern in der Regel die neueste.
Um aber ein Plugin für meine Hauptprogramm schrieben zu können muss er offensichtlich eine JDK der Version 1.6 verwenden ansonsten kommt es zur oben genannten Exception.
Irgendwie verstehe ich dieses Konzept aber nicht, denn ich fänds irgendwie logischer wenn die Plugins die mit JDK 1.7 oder höher entwickelt wurden abwärtskompatibel sein sollten, und nicht unbedingt mit JDK 1.6 zu entwickeln sind. Dem ist halt aber nicht so.
Muss ich dem Dritten jetzt also jedes mal die JDK Version 1.6 mitgeben damit er seine PluginKlasse kompilieren kann, bzw. muss ich ihm sagen dass er sich diese JDK Version runterladen muss, damit später keine Exception geworden werden.
Java:
package starter;
import interfaces.ExternalFunction;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import javax.swing.JOptionPane;
public class Starter
{
public static void main(String[] args)
{
try
{
ArrayList<ExternalFunction> externalFunctionArrayList = new ArrayList<ExternalFunction>();
File pluginFile = new File("C:\\Users\\Ich\\Desktop\\MyProgram2\\Plugins");
File[] pluginJars = pluginFile.listFiles(new JARFileFilter());
URL[] urls = new URL[pluginJars.length];
for (int i = 0; i < pluginJars.length; i++)
{
urls[i] = pluginJars[i].toURI().toURL();
System.out.println(urls[i]);
}
URLClassLoader urlClassLoader = new URLClassLoader(urls);
for(int i=0; i <pluginJars.length; i++)
{
JarInputStream jarInputStream = null;
try
{
jarInputStream = new JarInputStream(new FileInputStream(pluginJars[i]));
JarEntry jarEntry = jarInputStream.getNextJarEntry();
while(jarEntry != null)
{
if(jarEntry.getName().toLowerCase().endsWith(".class"))
{
String clazzLocation = jarEntry.getName().substring(0, jarEntry.getName().length()-6).replace('/', '.');
Class<?> clazz = urlClassLoader.loadClass(clazzLocation);
Object object = clazz.newInstance();
if(object instanceof ExternalFunction)
externalFunctionArrayList.add((ExternalFunction)object);
}
jarEntry = jarInputStream.getNextJarEntry();
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
jarInputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
externalFunctionArrayList.get(0).doSomething();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
Zuletzt bearbeitet: