当 ClassLoader 找不到报告的类时,将引发 ClassNotFoundException。这通常意味着 CLASSPATH 中缺少该类。这也可能意味着有问题的类正在尝试从父类装入器中装入的另一个类装入,因此子类装入器中的类不可见。在更复杂的环境中(如应用程序服务器)中工作时,有时会出现这种情况(WebSphere因此类类装入器问题而臭名昭着)。
人们经常倾向于混淆,但有一个重要的区别。例如,一个异常(一个错误实际上是自是java.lang.Error的子类),比如java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory
并不意味着 ActiveMQConnectionFactory 类不在 CLASSPATH 中。事实上恰恰相反。这意味着类ActiveMQConnectionFactory是由ClassLoader找到的,但是当尝试加载该类时,它在读取类定义时遇到了错误。当有问题的类具有静态块或成员使用 ClassLoader 找不到的类时,通常会发生这种情况。因此,要找到罪魁祸首,请查看相关类的源代码(在本例中为ActiveMQConnectionFactory),并使用静态块或静态成员查找代码。如果您无权访问源代码,则只需使用 JAD 对其进行反编译即可。
在检查代码时,假设您找到一行如下所示的代码,请确保 CLASSPATH 中的类 SomeClass。
private static SomeClass foo = new SomeClass();
提示:要找出一个类属于哪个jar,您可以使用网站jarFinder。这允许您使用通配符指定类名,并在其 jar 数据库中搜索该类。jarhoo允许你做同样的事情,但它不再免费使用。
如果要在本地路径中找到类所属的 jar,可以使用类似 jarscan ( http://www.inetfeedback.com/jarscan/ ) 之类的实用程序。您只需指定要查找的类以及您希望它开始在 jar 和 zip 文件中搜索该类的根目录路径。