3

我们有一个 servlet 项目,其中包含(在许多其他类中)我们向用户公开的接口。

用户可以编译他们自己的实现所提供接口的类(以 .class 文件的形式),并将它们放在我们项目知道的文件夹中。当 servlet 启动时,它使用 URLClassLoader 加载该文件夹中的所有 .class 文件。(因此用户可以参与某些事件。)

据我所知,类文件的位置和加载正确,有点。加载用户编译的 .class 文件时,会抛出 ClassNotFoundException 异常,但它会抱怨接口,该接口应该已经在类路径上。

Caused by: java.lang.ClassNotFoundException: com.company.project.OurInterface
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

动态加载.class文件时,找不到接口是不是有原因?

4

3 回答 3

3

也许你没有为你的URLClassLoader.

您的应用程序的类加载器应该是动态类加载器的父类加载器:

ClassLoader dynamicClassLoader = 
    new URLClassLoader(..., OutInterface.class.getClassLoader());
于 2010-11-01T21:44:19.403 回答
0

也许是因为您尝试从“动态类”路径加载该接口?当你把你的界面也放在那里时会发生什么?

于 2010-11-01T21:41:00.667 回答
0

可能是因为您使用的是不同的类加载器,并且它没有找到由它的类加载器加载的类。

您是否考虑过为此使用 SPI?http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider(对不起旧链接,但方法是一样的。

于 2010-11-01T21:41:10.963 回答