我正在尝试用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插件类路径中使用类加载器,但我不知道如何做到这一点。
1条答案
按热度按时间iqxoj9l91#
我找到了解决问题的方法:
因为我正在开发一个spigotmc插件,所以
Thread.currentThread().getContextClassLoader()
是我的spigotmc服务器的类路径。为了从我的插件加载类,我需要使用PluginMainClass.class.getClassLoader()
.我希望我能在这个职位上帮助别人;-)