我有3个Java项目A,B和C。
B就像是A的附加组件。A和B都依赖于项目C的某些类。

现在在项目A中,当我使用URLClassLoader时,如下所示:

URLClassLoader ucl = new URLClassLoader(urls); //urls are paths to some classes in B


现在,当使用这些ucl时,当我在B中调用某些方法时,它给了我“未找到类定义”异常。这是针对C类的。

现在,当我使用ClassLoader时,如下所示:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader ucl = new URLClassLoader(urls, classLoader);


当我在B中调用方法时,此方法工作正常。
我的问题:

1)当我第一种方法使用哪种ClassLoader时?我阅读了JavaDocs,但找不到任何可以解释的东西。
2)有没有一种方法可以获取特定于项目B的ClassLoader,我可以以某种方式使用它,这样我就不会遇到任何依赖关系问题?

谢谢你的帮助。

最佳答案

默认的类加载器是系统类加载器(将类加载到类路径上)。

如果您使用特定的类加载器在B中加载了类,请使用该实例。否则,someTypeInB.getClass().getClassLoader()会作为黑客。

(注意:使用URLClassLoader.newInstance通常比new URLClassLoader更可取,因为它增加了用于不受信任的代码所必需的安全措施(尽管还不是很充分)。另外,使用线程上下文类加载器通常也是一个坏主意-您引入了对本地代码的依赖性,但是设置并使用了线程(无论如何,线程可能没有应用任何一致的策略)。)

关于java - URLClassLoader引发未找到类定义异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7652493/

10-10 03:12