我有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/