Java: dlaczego kod spakowany do pliku jar uniemożliwia dostęp do klas zewnętrznych?

Mam system wtyczek dla mojej aplikacji Java. Wywoływam klasę zewnętrzną za pomocą programu ładującego klasy URL. Ta część działa dobrze, zarówno gdy moja aplikacja jest uruchamiana jako pliki klas, a moja aplikacja jest w postaci JAR. Problem, z którym się spotykam, polega na tym, że pliki wtyczek mogą uruchamiać swój własny niezależny kod, ale tworzą JPanel. Kiedy próbuję dodać ten JPanel do JPanel, który jest w głównej klasie aplikacji, otrzymuję wyjątek zerowego wskaźnika odwołujący się do głównej klasy. (com.cpcookieman.app.Main) Ale to się nie zdarza, gdy uruchamiam pliki klas dla aplikacji, tylko gdy jest spakowana. Jak mogę to rozwiązać?

Dlaczego mój kod spakowany do pliku jar zapobiega dostępowi klas zewnętrznych do klas wewnątrz słoika?

EDYCJA: Zgodnie z żądaniem, ślad stosu.

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)

EDYCJA 2: Kod ładowania klasy

    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**

Wtyczka ładuje się za pomocą swojego konstruktora i tworzy panel do dodania do ramki znajdującej się wewnątrz jednej z klas w pliku JAR. JAR jest główną aplikacją, jeśli ktoś o tym myli.

questionAnswers(1)

yourAnswerToTheQuestion