【发布时间】: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