noclassdeffounderror-通过spigotmc插件中的urlclassloader加载子类

qojgxg4l  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(402)

我正在尝试用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 .
当我用我们的类执行代码时 TestService 延伸 Service ,我的代码运行良好,可以打印出我想要的所有文本。但由于某种原因,当我试图 TestService 一个子类 Service ,我得到一个 NoClassDefFoundError .
我已经试过使用 Thread.currentThread().getContextClassLoader() 初始化我的 URLClassLoader 但这没什么区别。我还尝试将api包含到buildtestservice.jar中,没有任何区别。
有一件事,我可能会提到:我正在尝试将其作为bukkit/spigotmc插件的一部分进行开发。这可能就是为什么程序不知道 Service 班级。在这种情况下,我需要在microservices.jar插件类路径中使用类加载器,但我不知道如何做到这一点。

iqxoj9l9

iqxoj9l91#

我找到了解决问题的方法:
因为我正在开发一个spigotmc插件,所以 Thread.currentThread().getContextClassLoader() 是我的spigotmc服务器的类路径。为了从我的插件加载类,我需要使用 PluginMainClass.class.getClassLoader() .
我希望我能在这个职位上帮助别人;-)

相关问题