【问题标题】:NoClassDefFoundError - Loading subclass via URLClassLoader inside a SpigotMC PluginNoClassDefFoundError - 通过 SpigotMC 插件中的 URLClassLoader 加载子类
【发布时间】:2020-11-29 02:29:53
【问题描述】:

我正在尝试用 Java 构建一个微服务系统。对于服务本身,我创建了一个类Service,所有服务都扩展了它。示例服务如下所示:

package me.test;

public class TestService extends Service {

    public TestService() {
        System.out.println("It works!");
    }

    public static void execute(String s) {
        System.out.println(s);
    }

}

我的服务加载器类看起来有点像这样:

package me.microservices.app;

public class ServiceLoader {

    public ServiceLoader() {
        List<File> files = Arrays.asList(new File(getDataFolder().getPath() + "/services").listFiles());
        URL[] urls = new URL[files.size()];
        for (int i = 0; i < files.size(); i++) {
            try {
                urls[i] = files.get(i).toURI().toURL();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        URLClassLoader serviceClassLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());

        Class<?> testServiceClass = Class.forName("me.test.TestService", false, serviceClassLoader);
        testServiceClass.getMethod("execute", String.class).invoke(this, "This is a certified hood classic!!!");
    }

}

Service 类是我在 me.microservices.api.Service 的微服务应用程序的一部分。

当我使用扩展 Service 的类 TestService 执行我的代码时,我的代码运行良好并打印出我想要的所有文本。但由于某种原因,当我尝试将 TestService 设为 Service 的子类时,我得到了 NoClassDefFoundError

我已经尝试在初始化我的URLClassLoader 时使用Thread.currentThread().getContextClassLoader(),但这并没有什么区别。我还尝试将我的 API 包含到构建 TestService.jar 中,也没有任何区别。

我可能会提到一件事:我正在尝试将其作为 Bukkit/SpigotMC 插件的一部分进行开发。这可能是程序不知道Service 类的原因。在这种情况下,我需要在 microservices.jar 插件类路径中使用类加载器,但我不知道该怎么做。

【问题讨论】:

    标签: java classloader noclassdeffounderror bukkit urlclassloader


    【解决方案1】:

    我找到了解决问题的办法:

    由于我正在开发一个 SpigotMC 插件,Thread.currentThread().getContextClassLoader() 的类路径是我的 SpigotMC 服务器的类路径。为了从我的插件加载类,我需要使用PluginMainClass.class.getClassLoader()

    我希望我能在这篇文章中帮助别人;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2014-09-01
      • 1970-01-01
      相关资源
      最近更新 更多