Java: por que o código empacotado em um arquivo jar impede o acesso de classes externas?

Eu tenho um sistema de plugins para o meu aplicativo Java. Eu invoco uma classe externa com o carregador de classes de URL. Essa parte funciona bem, quando meu aplicativo é executado como arquivos de classe e quando meu aplicativo está no formato JAR. O problema que estou correndo é, os arquivos do plugin podem executar o seu próprio código independente muito bem, mas eles criam um JPanel. Quando tento adicionar esse JPanel ao JPanel que está na classe principal do aplicativo, recebo uma exceção de ponteiro nulo referenciando a classe principal. (com.cpcookieman.app.Main) Mas isso não acontece se eu executar os arquivos de classe para o aplicativo, somente quando estiver empacotado. Como posso resolver isso?

Por que meu código sendo empacotado em um arquivo jar impede que classes externas acessem classes dentro do jar?

EDIT: conforme solicitado, o rastreamento de pilha.

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: O código de carregamento da turma

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

O plugin é carregado usando seu construtor e cria um painel para ser adicionado ao quadro que está dentro de uma das classes dentro do arquivo JAR. O JAR é o aplicativo principal, se alguém estiver confuso sobre isso.

questionAnswers(1)

yourAnswerToTheQuestion