Java ServiceLoader.next导致NoClassDefFoundError

Java ServiceLoader.next导致NoClassDefFoundError,java,noclassdeffounderror,serviceloader,Java,Noclassdeffounderror,Serviceloader,我这么问是因为我完全不确定我做的是对的。我正在使用Eclipse进行一个web项目。让我们在包com.web.project中称之为WebProject(duh) 我希望WebProject在运行时加载JAR插件,因此我认为可以利用java.util.ServiceLoader。因此,我在WebProject项目中创建了一个接口com.web.project.WebProjectPlugin,其中包含插件必须实现的所有方法 然后我创建了项目PluginProject,将WebProbject/b

我这么问是因为我完全不确定我做的是对的。我正在使用Eclipse进行一个web项目。让我们在包
com.web.project
中称之为WebProject(duh)

我希望WebProject在运行时加载JAR插件,因此我认为可以利用
java.util.ServiceLoader
。因此,我在WebProject项目中创建了一个接口
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...
}
然后我在plugin项目中创建了一个META-INF/services文件夹,将文本文件
com.web.project.WebProjectPlugin
放入其中,其中只包含一行“com.web.project.plugin.TestPlugin”

我导出了JAR文件,签出了added 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);
}
File[]jlist=pluginsDir.listFiles(新文件过滤器(){
公共布尔接受(文件){
返回文件.getPath().toLowerCase().endsWith(“.jar”);
}
});
URL[]URL=新URL[jlist.length];
对于(int i=0;i
pluginsDir
是一个
文件
对象,指向JAR文件所在的目录。起初,似乎
srvl
完成了它的工作,因为
iter
不是空的,但当它到达
iter.next()时,它抛出可怕的
NoClassDefFoundError

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

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


这是问题所在。

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

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

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

我想你的意思是
Thread.currentThread().getContextClassLoader()
,但你知道吗?它跑得很好!谢谢