【问题标题】:Error java.lang.NoClassDefFoundError on org.springframework.webflow.util.RandomGuidorg.springframework.webflow.util.RandomGuid 上的错误 java.lang.NoClassDefFoundError
【发布时间】:2010-09-27 09:10:01
【问题描述】:

对不起,我的问题很愚蠢,但作为一个java文盲,我无法回答。我在 CentOS5(用于 CAS 服务器)上运行了一个 tomcat (5),当我尝试打开这个 URL http://192.168.1.17:8080/cas-server-webapp-3.3.1/login 时,我收到了这个错误:

第一个错误: java.lang.NoClassDefFoundError:无法初始化类org.springframework.webflow.util.RandomGuid

和根错误: org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是 java.lang.NoClassDefFoundError: 无法初始化类 org.springframework.webflow.util.RandomGuid

$CLASSPATH 是空的,好像有问题,但是不知道往里面放什么。

编辑:Jared 是对的,我的主机文件将 127.0.0.1 定义为 localhost,现在它工作得很好!

【问题讨论】:

    标签: java linux tomcat classpath centos5


    【解决方案1】:

    在这种情况下,记住两到三个不同的例外情况很重要:

    1. java.lang.ClassNotFoundException 此异常表示在类路径中找不到该类。这表明我们正在尝试加载类定义,而类路径中不存在该类。

    2. java.lang.NoClassDefFoundError 此异常表明 JVM 在其内部类定义数据结构中查找类的定义,但没有找到。这与说它无法从类路径加载不同。通常这表明我们之前尝试从类路径加载一个类,但由于某种原因失败了 - 现在我们再次尝试,但我们甚至不会尝试加载它,因为我们之前加载它失败了。较早的失败可能是 ClassNotFoundException 或 ExceptionInInitializerError(指示静态初始化块中的失败)或任何数量的其他问题。关键是,NoClassDefFoundError 不一定是类路径问题。

    话虽如此,另一个答案海报表明 RandomGUID 需要调用 InetAddress.getLocalHost()。在许多操作系统上,这将触发使用主机文件的主机查找(在 *NIX 系统上为/etc/hosts,在 Windows 系统上为%WINDOWS%/system32/drivers/etc/HOSTS。)

    当该文件错误地定义了本地主机地址时,我经常看到类似的错误。 127.0.0.1 应该指向 'localhost'(也可能是 localhost.localdomain。)它应该指向机器的实际主机名(尽管出于某种原因,许多旧的 RedHat Linux 安装程序喜欢设置错误。)

    【讨论】:

      【解决方案2】:

      现在,不应该使用环境变量 $CLASSPATH;相反,java 应用程序应该在命令行上设置类路径。

      但是,对于 webapps 中使用的 tomcat 和库,您只需将 JAR(用于 Spring)放入 tomcat 安装的 shared/lib/ 文件夹中。

      【讨论】:

        【解决方案3】:

        NoClassDef:在编译当前执行的类时,搜索到的类定义已经存在,但无法再找到该定义。由于您缺少一个 spring 类,我猜您缺少一个 spring jar 文件。

        有 2 个地方可以在 tomcat 中放置 jar,有一个全局区域(其中 5 个类似于 common/lib,在 tomcat6 中有点不同)和仅用于您的 webapp 的区域,即 webapps/mywebapp/WEB -INF/库。你的应用程序的 jars 真的应该放在这里,但是如果你真的很困惑并且想不出任何其他方法让它工作,它们将在全局中工作(如果你在全局中只有其中一些可能也会中断,因为他们可能需要另一个 jar 中的类,如果其中一个在本地,它将无法工作。对于 spring 库尤其如此,因为有许多单独的 jar,而不仅仅是一个)。

        您的 CLASSPATH 是 jvm 查找类的所有位置的列表。这可能包括类文件的目录,或者类的 jar 或 zip 文件,它们像目录一样列出。 Tomcat 应该通过正确使用上述目录为您加载它。

        【讨论】:

          【解决方案4】:

          原因是加载类 RandomGUID 失败。

          从查看 RandomGUID source 来看,它的静态初始化程序在 InetAddress.getLocalHost() 失败的可能性很大。

          你的主机上有一些奇怪的网络配置吗?例如,/etc/hosts 中没有或奇怪的 localhost 定义?

          【讨论】:

          • 如果静态初始化程序失败,JVM 将抛出 ExceptionInInitializerError,而不是 NoClassDefFoundError。
          • 不,不是。当静态类初始化程序失败时,我已经看到了 1000 次如何抛出“java.lang.NoClassDefFoundError:无法初始化类”。但是,是的,可能只有我 :-)
          • JVM 可能会在类加载第一次失败时抛出 ExceptionInInitializeError,但在随后的加载尝试中可能会抛出 NoClassDefFoundError(如果之前失败,它不会重试加载类是足够聪明的。)
          • 我之前也遇到过类似的问题(尤其是在旧的 RedHat Linux 版本上),其中 /etc/hosts 文件被冲洗掉了(127.0.0.1 没有条目,或者 127.0.0.1 是实际主机的别名名称而不是本地主机。)
          【解决方案5】:

          如果这与您正在构建的内容突然出现且不合逻辑,请尝试重命名和重命名错误日志中引用的类。这在 Netbeans 中帮助了我好几次。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-04-06
            • 1970-01-01
            • 2022-06-29
            • 2019-08-29
            • 2017-09-21
            • 1970-01-01
            • 1970-01-01
            • 2016-09-18
            相关资源
            最近更新 更多