Java: Warum verhindert in eine JAR-Datei gepackter Code den Zugriff externer Klassen?

Ich habe ein Plugin-System für meine Java-App. Ich rufe eine externe Klasse mit dem URL-Klassenladeprogramm auf. Dieser Teil funktioniert gut, sowohl wenn meine Anwendung als Klassendateien ausgeführt wird, als auch wenn meine Anwendung in JAR-Form vorliegt. Das Problem, auf das ich stoße, ist, dass die Plugin-Dateien ihren eigenen, unabhängigen Code ausführen können, aber sie erstellen ein JPanel. Wenn ich versuche, dieses JPanel zu dem JPanel hinzuzufügen, das sich in der Hauptanwendungsklasse befindet, erhalte ich eine Nullzeigerausnahme, die auf die Hauptklasse verweist. (com.cpcookieman.app.Main) Aber das passiert nicht, wenn ich die Klassendateien für die Anwendung ausführe, nur wenn sie gepackt sind. Wie kann ich das lösen?

Warum verhindert mein Code, der in eine JAR-Datei gepackt wird, dass externe Klassen auf Klassen in der JAR zugreifen können?

EDIT: Wie gewünscht, der Stack-Trace.

java.lang.NullPointerException
    at TestPlugin2.Main.<init>(Main.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at com.cpcookieman.ph.PluginLoader$2.run(PluginLoader.java:74)
    at java.lang.Thread.run(Unknown Source)

EDIT 2: Der Klassenlade-Code

    String pluginsPath;
    if (Main.os.equals("Windows"))
    {
        pluginsPath = "C:\\plugins\\";
    }
    else
    {
        pluginsPath = "~/plugins/";
    }
    File file = new File(pluginsPath);
    if (!file.exists())
    {
        System.out.println("DEBUG: Plugin path could not be found!");
    }
    try
    {
        URL url = file.toURI().toURL();
        final URL[] urls = new URL[]{url};
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    ClassLoader cl = new URLClassLoader(urls);
                    Class plugin = cl.loadClass(text + ".Main");
                    plugin.newInstance();
                    close();
                }
                **snip catch statements**
            }
        }).start();
    }
    **snip catch statements**

Das Plugin wird mit seinem Konstruktor geladen und erstellt ein Bedienfeld, das dem Frame hinzugefügt wird, der sich in einer der Klassen in der JAR-Datei befindet. Die JAR ist die Hauptanwendung, wenn jemand darüber verwirrt ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage