gpt4 book ai didi

java - ServiceLoader.next 导致 NoClassDefFoundError

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:59 24 4
gpt4 key购买 nike

我问是因为我完全确定我做了正确的事。我正在将 Eclipse 用于 Web 项目。让我们在包 com.web.project 中称它为 WebProject (duh)。

我希望 WebProject 在运行时加载 JAR 插件,所以我想我可以利用 java.util.ServiceLoader。因此,我在 WebProject 项目中创建了一个接口(interface) com.web.project.WebProjectPlugin,其中包含插件必须实现的所有方法。

然后我创建了项目 PluginProject,在其构建路径中添加 WebProbject/build/classes 作为类文件夹:

package com.web.project.plugin;

import com.web.project.WebProjectPlugin;

public class TestPlugin implements WebProjectPlugin {
// Implementation of the interface methods...
}

然后我在插件项目中创建了一个 META-INF/services 文件夹,将文本文件 com.web.project.WebProjectPlugin 放在里面,包含唯一的一行“com.web.project.plugin .TestPlugin”。

我导出了 JAR 文件,检查添加的 build/classes 文件夹并将其放在硬盘驱动器中的某个位置。当 WebProject 启动时,它会执行以下操作:

File[] jlist = pluginsDir.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.getPath().toLowerCase().endsWith(".jar");
}
});
URL[] urls = new URL[jlist.length];
for (int i = 0; i < jlist.length; i++)
urls[i] = jlist[i].toURI().toURL();
URLClassLoader ucl = new URLClassLoader(urls);

ServiceLoader<WebProjectPlugin> srvl =
ServiceLoader.load(WebProjectPlugin.class, ucl);
Iterator<WebProjectPlugin> iter = srvl.iterator();
while (iter.hasNext()) {
WebProjectPlugin plugin = iter.next();
plugins.add(plugin);
}

pluginsDir 是一个 File 对象,指向 JAR 文件所在的目录。起初似乎 srvl 完成了它的工作,因为iter 不是空的,但是当它到达 iter.next() 时它会抛出可怕的 NoClassDefFoundError

我已经设法创建了一个插件管理器项目来测试 ServiceLoader,它运行得很好,但它是一个普通的控制台 Java 应用程序,而不是一个 Web 项目。那么,我在这里做错了什么?

我有点疑惑:它怎么找到 com.web.project.WebProjectPlugin 的类定义,因为它在同一个正在运行的项目中?这与我正在使用的 URLClassLoader 对象有关吗?

这是 stack trace .

最佳答案

尝试将父类加载器分配给您的 URLClassLoader

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

WebProject 需要特定的类加载器层次结构,因此如果父/子层次结构设置不正确,您的类可能彼此不可见。

关于java - ServiceLoader.next 导致 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com