java.lang.ClassFormatError JVMCFRE076 错误的魔数

4

这个问题已经部分解决。我会写下来,因为现在谷歌并没有提供太多帮助。

我的Web应用在本地Ubuntu Linux Java环境中运行良好。当我将其部署到SUSE Linux环境中时,出现了以下异常:

java.lang.RuntimeException: java.lang.ClassFormatError: JVMCFRE076 bad magic number;
class=com/package/util/MongodbUtil, offset=0 Error: java.lang.ClassFormatError: JVMCFRE076 bad magic number;
class=com/package/util/MongodbUtil, offset=0 /items added=0 /items deleted=0 /items unchanged=0

问题源于类名。只有当类名包含“Util”时,才会抛出异常。我将该类重命名为DbTool后,一切都正常了。深入挖掘后,发现类名中不能包含包名的部分。
我有一个解决方法,虽然可以工作,但我仍然想知道为什么会抛出异常以及为什么它在我的本地环境中能够工作,但在远程环境中却不能工作。
我的本地Tomcat运行在Open JDK 1.6.0_27上,而远程Tomcat运行在IBM JRE 1_6_0上。两个环境都使用Tomcat 6.36。

我非常怀疑,如果您的包含有“util”名称的包,那么您的类名也不能包含“util”(大写或小写)-- 问题肯定出在其他地方。为了反驳您所说的话,请看一下Spring框架中的“StringUtils”-- 它位于“org.springframework.util”包下,而且它完美地工作! - Liv
虽然你发表了这个答案已经有一段时间了,但我还是想留下我的评论。我在和Java打交道的近10年中第一次遇到这种奇怪的错误。在我的情况下,它是由于损坏的类文件引起的 - 如果你想要更多细节,我可以单独发布一个答案。 - Miljen Mikic
感谢您的评论。当我从IBM JRE更改为Oracle JRE时,我的问题得到了解决。我仍然不知道原因。您可以随时发布您的答案,这可能会帮助未来的某个人。 - Leonard Saers
1个回答

5

造成此问题的原因是您在编译和运行时使用了不同的Java虚拟机(Sun HotSpot VM和IBM J9 VM)。换言之,只要编译和运行环境一致,就不会出现此问题。


我想测试这个,但安装 IBM JDK 有点复杂。 - Leonard Saers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接