【问题标题】:How would I fix this classloader issue?我将如何解决这个类加载器问题?
【发布时间】:2012-10-08 07:42:35
【问题描述】:

首先让我说我在 Java 方面不是最擅长的,所以我可能错过了一些非常简单的事情......

我正在开发一个插件系统,并且在 Eclipse 中一切正常,但当我实际在它之外启动小程序时却没有。

我正在尝试从目录加载.class 文件并执行它,我知道它为什么不起作用我只是不知道如何解决它。

问题是 Eclipse 在类路径中引用了小程序本身,但在 eclipse 之外的类路径中没有引用它,我无权访问 -cp-classpath,我只能通过旨在加载具有固定类路径的 jar 的启动器启动它。

关于如何解决此问题的任何想法?

加载器代码:

final ClassLoader loader = new URLClassLoader(new URL[] { new File("C:/Plugin/Directory/").toURI().toURL() });
final Class<?> c = loader.loadClass("PluginFile");
Object s = c.newInstance();
s.getClass().getMethod("onLoad").invoke(s);

插件代码:

import net.plugintest.pluginsystem.*;

public class PluginFile extends ClientPlugin
{
    private String Author = "Plugin Author";
    private String Description = "Plugin Description"
    private Player p = new Player();

    @Override
    public void onLoad() 
    {
        p.talk("Testing");
    }
}

这个问题困扰了我一个星期,我不知道该怎么办。 :/

【问题讨论】:

  • 使用 URLClassLoader 在你的类路径上加载你想要的类也参考:stackoverflow.com/questions/252893/…
  • 你遇到了什么异常?
  • java.lang.ClassNotFoundException: net.plugintest.pluginsystem.ClientPlugin

标签: java classloader urlclassloader


【解决方案1】:

我不确定,但请尝试为您创建的类加载器提供父类加载器,例如:

ClassLoader parent = Thread.currentThread().getContextClassLoader();
// or
// ClassLoader parent = getClass().getClassLoader();
ClassLoader loader = new URLClassLoader(new URL[] { new File("C:/Plugin/Directory/").toURI().toURL() }, parent);

【讨论】:

  • 不,我仍然收到java.lang.ClassNotFoundException: net.plugintest.pluginsystem.ClientPlugin:/
  • 啊,我觉得自己像个呆子。您的回答对我有所帮助,而不是Thread.currentThread().getContextClassLoader() 我使用了ClientPlugin.class.getClassLoader(),它解决了我的问题。 :P
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2019-10-14
  • 2020-03-25
  • 2020-02-14
相关资源
最近更新 更多