对不起,我的问题很愚蠢,但作为一名java文盲,我无法回答这个问题。我在CentOS5上运行tomcat(5)(对于CAS服务器),当我尝试打开此URL http://192.168.1.17:8080/cas-server-webapp-3.3.1/login时出现此错误:
第一个错误: java.lang.NoClassDefFoundError:无法初始化类 org.springframework.webflow.util.RandomGuid
和root错误: org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是java.lang.NoClassDefFoundError:无法初始化类org.springframework.webflow.util.RandomGuid
$ CLASSPATH是空的,这似乎是一个问题,但我不知道该放进去。
编辑:Jared是对的,我的主机文件将127.0.0.1定义为localhost,现在它运行得很好!答案 0 :(得分:25)
在这种情况下,保持两到三个不同的例外是很重要的:
java.lang.ClassNotFoundException
此异常表示在类路径中找不到该类。这表明我们正在尝试加载类定义,并且该类在类路径中不存在。
java.lang.NoClassDefFoundError
此异常表示JVM在其内部类定义数据结构中查找了类的定义但未找到它。这与说它无法从类路径加载不同。通常这表明我们之前尝试从类路径加载一个类,但由于某种原因它失败了 - 现在我们再次尝试,但我们甚至都不会尝试加载它,因为我们之前没有加载它。较早的失败可能是ClassNotFoundException或ExceptionInInitializerError(表示静态初始化块中的失败)或任何其他问题。关键是,NoClassDefFoundError不一定是类路径问题。
话虽如此,另一个回答海报表明RandomGUID需要调用InetAddress.getLocalHost()。在许多操作系统上,这将触发主机查找,该主机查找将使用主机文件(* /etc/hosts
在* NIX系统上,%WINDOWS%/system32/drivers/etc/HOSTS
在Windows系统上。)
当该文件错误地定义localhost地址时,我经常看到类似的错误。 127.0.0.1
应该指向'localhost'(也可能是localhost.localdomain
。)它应该 NOT 指向机器的实际主机名(虽然由于某种原因,许多较旧的RedHat Linux安装程序喜欢错误地设置它。)
答案 1 :(得分:1)
现在,不应该使用环境变量$ CLASSPATH;相反,java应用程序应该在命令行上设置类路径。
但是,对于webapps中使用的tomcat和库,只需将JAR(用于Spring)放入tomcat安装的shared / lib /文件夹中即可。
答案 2 :(得分:1)
NoClassDef:编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。因为你错过了一个春季课,我猜你错过了一个春天的jar文件。
在tomcat中有两个放置jar的地方,有一个全局区域(在5中类似于common / lib,在tomcat6中有点不同)和仅适用于你的webapp的区域,即webapps / mywebapp / WEB -INF / lib目录下。你的应用程序的罐子应该真的到了这里,但是如果你真的很困惑并且无法找出任何其他方法来使它工作,它们将在全球范围内工作(如果你在全球范围内只有一些它可能也可以打破,因为他们可能需要另一个jar中的一个类,如果一个部分在本地则无法工作。对于spring库来说尤其如此,因为有许多独立的jar,而不仅仅是一个。
你的CLASSPATH是jvm查找类的所有地方的列表。这可能包括类文件的目录,或类的jar或zip文件,它们列在目录中。 Tomcat应该正确地使用上面提到的目录为你加载。
答案 3 :(得分:1)
原因是无法加载类RandomGUID。
从查看RandomGUID source开始,其静态初始化程序在InetAddress.getLocalHost()失败的大部分机会。
你在主机上有一些奇怪的网络配置吗?例如,/ etc / hosts中没有或奇怪的localhost定义?
答案 4 :(得分:0)
如果突然出现并且没有出现在您构建的内容中,请尝试重命名并重命名错误日志中引用的类。这让我在Netbeans中多次帮助过。