【发布时间】:2012-06-24 09:07:52
【问题描述】:
我的 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 是主要应用程序,如果有人对此感到困惑的话。
【问题讨论】:
-
“Wut”?也许他们在 CP 中没有 JAR? (但是,在大多数情况下,NPE 是一个不同的问题...因为类加载失败会导致经常杀死 VM 的 Nasty-Non-NPE-Exception。也许应该调查一下而不是责备类加载器/加载 :-)
-
JAR 是否需要在某个文件夹中才能将其包含在类路径中?如果是这样,JAR 是否可以自我调整以将自己放入类路径中?
-
JAR 必须在 in 类路径中;它不能把自己放在那里。 (还要确保类/类没有/没有被使用的陈旧版本......因为这可能是一件令人讨厌的事情。)
-
你能发布堆栈跟踪吗?
-
您将不得不发布一些代码,从 TestPlugin2.Main.java 开始。更好的是发布所有内容或一个自包含的小例子来展示问题 - HTH
标签: java eclipse swing jar classloader