尝试运行Java jar文件时出现“ClassFormatError:不兼容的魔术值”

时间:2011-07-22 23:57:17

标签: java

我输入“java -jar ShowTime.jar”,并收到此错误消息:

Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1347093252 in class file ShowTime
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

我该如何解决这个问题? 附:我有一个mac。

4 个答案:

答案 0 :(得分:18)

Java类应该以magic(十六进制)值0xCAFEBABE开头(整齐)。您的值1347093252是十六进制的0x504B0304,恰好是ZIP文件的神奇值(ASCII中的前两个字节是Phil Katz的PK,ZIP格式的创建者)。一个罐子也是一个zipfile btw,所以你的罐子可能已经腐败了。尝试重建整个项目。

答案 1 :(得分:1)

这通常意味着你为一个较新版本的java编译jar而不是你运行它。检查您是否使用相同版本的java进行编译和运行。如果这不能解决问题,请提供更多信息,例如编译器命令和java -version的输出。

答案 2 :(得分:0)

这意味着您的应用程序正在使用一个jar文件,该文件在某些​​其他系统中以特定格式编译。现在,当您尝试在其他系统中使用该项目时,另一个系统将无法解码jar,因为每个系统都会生成一个特定的密钥来捆绑该项目。

远程调试ID是查找哪个jar格式不正确的最佳方法。在注释提示中运行命令以进行远程调试

java -agentlib:jdwp = transport = dt_socket,server = y,address = 8001,suspend = n(运行jar的命令和参数)

您需要的是,找到jar文件并替换为另一个jar(可能是新下载的jar,或者如果您的队友有jar。请使用它。)

我得到的错误是因为我的项目方式与另一个项目ABC有依赖性,而ABC使用的是通用jar。但是项目ABC与魔术钥匙捆绑在一起。我已经用下载的jar替换了ABC使用的jar。

答案 3 :(得分:0)

当我的 jar 的主类名与其文件名不同时,我收到此错误。

例如,jar 的主类被命名为 Foo.java,在里面我有 public class Bar { ... } 而不是 public class Foo { ... }

这可能不是最通用的答案,但使文件名和类名相同为我解决了这个问题。