Moin,
ich hatte in den letzten Tagen ein einfaches Pluginsystem entwickelt und meine Plugins werden auch geladen und ausgeführt. Allerdings bekomme ich immer eine ClassNotFound Exception wenn der URLClassLoader versucht mein Plugininterface zu laden. Eigentlich sollte der ClassLoader das Interface finden das ist ja auch in der jar.
Hier ist meine Pluginloading Klasse:
[CODE lang="java" title="PluginAdministration.java"]package plugintestsystem;
import pluginsystem.Plugin;
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.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
public class PluginAdministration {
final String pluginDir = "E:/ProgrammierProjekte/Intellij/Plugin/out/artifacts/Plugin_jar";
public List<Plugin> loadPlugins() throws IOException{
File pluginDirFile = new File(pluginDir);
if (!pluginDirFile.isDirectory()) {
System.err.println("Der angegebene Pfad ist kein Ordner!");
return null;
}
if (!(pluginDirFile.listFiles().length > 0)) {
System.err.println("Es gibt keine Plugins im Ordner!");
return null;
}
URL[] urls = new URL[pluginDirFile.listFiles().length];
int i = 0;
for (File pluginFile : pluginDirFile.listFiles()) {
urls[i++] = pluginFile.toURI().toURL();
}
URLClassLoader ucl = new URLClassLoader(urls, PluginAdministration.class.getClassLoader());
List<Plugin> plugins = new ArrayList<>();
for (File pluginFile : pluginDirFile.listFiles()) {
JarInputStream jarInputStream = new JarInputStream(new FileInputStream(pluginFile));
JarEntry jarEntry;
while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
try {
if (jarEntry.getName().endsWith(".class")) {
Class<?> pluginClass = ucl.loadClass(jarEntry.getName().substring(0, jarEntry.getName().length()-6));
for (Class<?> it : pluginClass.getInterfaces()) if (it.getName().equals(Plugin.class.getName())) plugins.add((Plugin) pluginClass.newInstance());
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} catch (NoClassDefFoundError e) {
e.printStackTrace();
}
}
}
return plugins;
}
}
[/CODE]
Der Output:
[CODE title="Output"]Applikation wird gestartet!
java.lang.NoClassDefFoundError: IllegalName: pluginsystem/PluginAdministration
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
java.lang.NoClassDefFoundError: IllegalName: pluginsystem/Plugin
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
java.lang.NoClassDefFoundError: IllegalName: plugintestsystem/PluginAdministration
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
Plugin wurde erfolgreich gestartet!
Plugin wurde erfolgreich gestoppt!
Applikation wurde gestoppt!
Process finished with exit code 0
[/CODE]
Vielleicht habe ich das mit dem Pluginloading auch noch nicht so ganz verstanden...
Falls ihr noch was braucht um mir zu helfen gerne fragen.
Danke schonmal im voraus
LG
Markus
ich hatte in den letzten Tagen ein einfaches Pluginsystem entwickelt und meine Plugins werden auch geladen und ausgeführt. Allerdings bekomme ich immer eine ClassNotFound Exception wenn der URLClassLoader versucht mein Plugininterface zu laden. Eigentlich sollte der ClassLoader das Interface finden das ist ja auch in der jar.
Hier ist meine Pluginloading Klasse:
[CODE lang="java" title="PluginAdministration.java"]package plugintestsystem;
import pluginsystem.Plugin;
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.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
public class PluginAdministration {
final String pluginDir = "E:/ProgrammierProjekte/Intellij/Plugin/out/artifacts/Plugin_jar";
public List<Plugin> loadPlugins() throws IOException{
File pluginDirFile = new File(pluginDir);
if (!pluginDirFile.isDirectory()) {
System.err.println("Der angegebene Pfad ist kein Ordner!");
return null;
}
if (!(pluginDirFile.listFiles().length > 0)) {
System.err.println("Es gibt keine Plugins im Ordner!");
return null;
}
URL[] urls = new URL[pluginDirFile.listFiles().length];
int i = 0;
for (File pluginFile : pluginDirFile.listFiles()) {
urls[i++] = pluginFile.toURI().toURL();
}
URLClassLoader ucl = new URLClassLoader(urls, PluginAdministration.class.getClassLoader());
List<Plugin> plugins = new ArrayList<>();
for (File pluginFile : pluginDirFile.listFiles()) {
JarInputStream jarInputStream = new JarInputStream(new FileInputStream(pluginFile));
JarEntry jarEntry;
while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
try {
if (jarEntry.getName().endsWith(".class")) {
Class<?> pluginClass = ucl.loadClass(jarEntry.getName().substring(0, jarEntry.getName().length()-6));
for (Class<?> it : pluginClass.getInterfaces()) if (it.getName().equals(Plugin.class.getName())) plugins.add((Plugin) pluginClass.newInstance());
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} catch (NoClassDefFoundError e) {
e.printStackTrace();
}
}
}
return plugins;
}
}
[/CODE]
Der Output:
[CODE title="Output"]Applikation wird gestartet!
java.lang.NoClassDefFoundError: IllegalName: pluginsystem/PluginAdministration
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
java.lang.NoClassDefFoundError: IllegalName: pluginsystem/Plugin
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
java.lang.NoClassDefFoundError: IllegalName: plugintestsystem/PluginAdministration
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:890)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at plugintestsystem.PluginAdministration.loadPlugins(PluginAdministration.java:50)
at Main.main(Main.java:24)
Plugin wurde erfolgreich gestartet!
Plugin wurde erfolgreich gestoppt!
Applikation wurde gestoppt!
Process finished with exit code 0
[/CODE]
Vielleicht habe ich das mit dem Pluginloading auch noch nicht so ganz verstanden...
Falls ihr noch was braucht um mir zu helfen gerne fragen.
Danke schonmal im voraus
LG
Markus