Interface PluginSystem ClassNotFound exception für library Klassen

H

H4CKSprogrammer

Mitglied
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:
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;
    }
}

Der Output:
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

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
 
L

LimDul

Top Contributor
Aus dem bauch heraus "plugintestsystem/PluginAdministration" ist kein gültiger Klassennamen. Der Klassenname ist vermutlich "plugintestsystem.PluginAdministration"

Du müsstest, wenn du die Jar-Entries in Klassennamen umwandelst, noch die Slashes durch Punkte ersetzen.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Zum Laden aller Klassen, die ein bestimmtes Interface implementieren, gibt es die ServiceLoader-API. Selber die Jar durchgehen und alle Klassen laden und per Hand testen muss man dafür nicht. :)
 
H

H4CKSprogrammer

Mitglied
Okay ich habe das mit dem ServiceLoader auch mal probiert:

PluginManager.java:
package pluginsystemServiceLoader;

import pluginsystem.Plugin;
import plugintestsystem.PluginAdministration;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ServiceLoader;

public class PluginManager {

    final String pluginDir = "E:/ProgrammierProjekte/Intellij/Plugin/out/artifacts/Plugin_jar";

    public List<Plugin> loadPlugins() throws MalformedURLException {
        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());

        System.out.println(Arrays.toString(ucl.getURLs()));

        List<Plugin> plugins = new ArrayList<>();

        ServiceLoader<Plugin> services = ServiceLoader.load(Plugin.class, ucl);

        for (Plugin plugin : services) {
            plugins.add(plugin);
            System.out.println("hi");
        }

        System.out.println("hiEnd");

        return plugins;
    }

}

Jedoch funktioniert das nicht. Irgendeine Idee?

LG
Markus
 
kneitzel

kneitzel

Top Contributor
Ich glaube, Du hast das mit der ServiceLoaderAPI etwas missverstanden.

Die Idee dabei ist doch, dass beim Aufruf die jar Dateien im ClassPath sind. Da diese Plugin jar Dateien alle eine entsprechende
META-INF/services/pluginsystem.Plugin Datei, die die Klassen auflistet, die das Plugin implementieren.

Da der Entwickler des Plugins weiss, was er a macht, kann er alles auflisten und dann kannst Du da entsprechend drauf zugreifen.

Bestes Beispiel ist die JDBC Schnittstelle. Das früher notwendige laden der Treiberklasse konnte so entfallen.

Also nicht mehr von Hand ein Plugin-Verzeichnis auswerten sondern einfach in den Classpath mit aufnehmen....
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
H

H4CKSprogrammer

Mitglied
@kneitzel
Erstmal danke für deine Antwort. Nun kann schon sein, dass ich das etwas falsch verstanden habe ich habe das auch noch nicht so ganz verstanden... Wollte es nur mal mit dem ServiceLoader ausprobieren. Die servicedatei in dem META-INF/services/ Verzeichnis hatte ich auch schon angelegt. Und wegen dem ClassPath dachte ich, dass es reichen würde einen ClassLoader zu erstellen ihm das verzeichnis mit den Jar Dateien zu geben und den ClassLoader dann weiter an den ServiceLoader zu geben um nicht manuell den Classpath angeben zu müssen...

@mrBrown
Auch dir erstmal danke für deine Antwort. Auf deine Frage:

Plugin.java:
import pluginsystem.Plugin;

public class MyPlugin implements Plugin {
    public MyPlugin() {

    }

    @Override
    public boolean start() {
        System.out.println("Plugin wurde erfolgreich gestartet!");
        SampleLib sampleLib = new SampleLib();
        sampleLib.write("Plugin started!");
        return true;
    }

    @Override
    public boolean stop() {
        System.out.println("Plugin wurde erfolgreich gestoppt!");
        return true;
    }
}
Dies ist mein TestPlugin in dem pluginDir habe ich sonst keine weiteren jars. Das mit der SampleLib war nur ein Test ob auch externe Librarys welche von Plugins implementiert werden geladen werden.

LG
Markus
 
H

H4CKSprogrammer

Mitglied
Aha was dieses Forum alles so bringt :) Ich hatte noch einen Tippfehler in der servicedatei jetzt wird das Plugin geladen jedoch kommt noch eine Exception wegen der implementierten SampleLib ich schaue mir die gleich mal an jedoch erstmal danke für die Hilfe.

LG
Markus
 
H

H4CKSprogrammer

Mitglied
Okay nochmal vielen vielen dank für eure Geduld, Zeit und Antworten.
Es funktioniert jetzt alles. Die Exception konnte ich auch noch lösen.

LG
Markus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
NicoDeluxe Pluginsystem Framework Allgemeine Java-Themen 8
L Java Applet - ClassNotFound online, offline korrekt Allgemeine Java-Themen 13
B ClassNotFound Allgemeine Java-Themen 4
O JSON: ClassNotFound Allgemeine Java-Themen 8
N ClassNotFound Exception bei JUnit Test? Allgemeine Java-Themen 2
J javafx "class path" exception Allgemeine Java-Themen 5
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
L Streams und Exception Allgemeine Java-Themen 8
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
T Konstruktor löst exception aus Allgemeine Java-Themen 7
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
7 Exception wird nicht aufgefangen Allgemeine Java-Themen 8
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
Final_Striker Exception bei neuem Look und Feel Allgemeine Java-Themen 2
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
nrg Stilistisch korrektes Exception Handling Allgemeine Java-Themen 4
F Geworfene Exception kommt nicht an Allgemeine Java-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben