Java: почему код, упакованный в jar-файл, препятствует доступу внешних классов?
У меня есть система плагинов для моего приложения Java. Я вызываю внешний класс с загрузчиком классов URL. Эта часть работает хорошо, как когда мое приложение запускается как файлы классов, так и когда мое приложение находится в форме JAR. Проблема, с которой я сталкиваюсь, заключается в том, что файлы плагинов могут выполнять собственный независимый код, но они создают JPanel. Когда я пытаюсь добавить этот JPanel к JPanel, который находится в основном классе приложения, я получаю исключение нулевого указателя, ссылающееся на основной класс. (com.cpcookieman.app.Main) Но этого не произойдет, если я запускаю файлы классов для приложения, только когда оно упаковано. Как я могу решить это?
Почему мой код, упакованный в файл jar, не позволяет внешним классам получать доступ к классам внутри jar?
РЕДАКТИРОВАТЬ: По запросу, трассировки стека.
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)
РЕДАКТИРОВАТЬ 2: код загрузки класса
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**
Плагин загружается с использованием его конструктора и создает панель для добавления к фрейму, который находится внутри одного из классов в файле JAR. JAR является основным приложением, если кто-то запутался в этом.