org.springframework.webflow.util.RandomGuid上的错误java.lang.NoClassDefFoundError

org.springframework.webflow.util.RandomGuid上的错误java.lang.NoClassDefFoundError,java,linux,tomcat,classpath,centos5,Java,Linux,Tomcat,Classpath,Centos5,很抱歉,我的问题很愚蠢,但作为一名java文盲,我无法回答。我在CentOS5上运行了tomcat(5)(用于CAS服务器),当我尝试打开此URL时,出现以下错误: 第一个错误: java.lang.NoClassDefFoundError:无法初始化类org.springframework.webflow.util.RandomGuid 和根错误: org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常为java.la

很抱歉,我的问题很愚蠢,但作为一名java文盲,我无法回答。我在CentOS5上运行了tomcat(5)(用于CAS服务器),当我尝试打开此URL时,出现以下错误:

第一个错误: 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,现在它工作得很好

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


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

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

tomcat中有两个地方可以放置JAR,一个是全局区域(第5个区域类似于common/lib,在tomcat6中有点不同),另一个区域仅用于您的webapp,即webapps/mywebapp/WEB-INF/lib。你的应用程序的jar应该放在这里,但是如果你真的很困惑,无法找到其他方法使其工作,那么它们将在全球范围内工作(如果全局中只有一部分,它也可能会崩溃,因为它们可能需要另一个jar中的一个类,如果本地有一个jar,它将无法工作。对于spring库尤其如此,因为有许多独立的jar,而不仅仅是一个)


您的类路径是jvm查找类的所有地方的列表。这可能包括类文件的目录,或类的jar或zip文件,这些文件与目录类似。Tomcat应该通过正确使用上述目录来为您加载这些目录。

原因是加载类文件失败

通过查看RandomGUID,其静态初始值设定项在InetAddress.getLocalHost()上失败的可能性最大


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

在这种情况下,在我们的头脑中保留两个或三个不同的异常是很重要的:

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

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

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


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

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

    如果静态初始值设定项失败,JVM将抛出ExceptionInInitializerError,而不是NoClassDefFoundError。不,不是真的。我已经看到了1000个错误当静态类初始值设定项失败时,如何抛出“java.lang.NoClassDefFoundError:无法初始化类”。但是,是的,可能只有我:-)JVM可能会在类加载第一次失败时抛出ExceptionInInitializeError,但在随后的加载尝试中可能会抛出NoClassDefFoundError(如果类以前失败了,就不需要重新加载了)我以前也遇到过类似的问题(尤其是在较旧的RedHat Linux版本上),其中/etc/hosts文件是隐藏的(127.0.0.1或127.0.0.1的条目没有别名为实际主机名,而不是本地主机名)