GAE ClassFormatError:不兼容的魔法值4022320623 EFBFBDEF

时间:2013-03-06 14:40:55

标签: java google-app-engine maven jetty

我在一个mavenized Eclipse项目中有一个简单的webapp。 我的pom.xml包含一些将Google的appengine-maven-plugin添加到构建插件的行。

当我运行mvn appengine:devserver时,我最终收到错误,告诉我无法加载我的课程:

  

[INFO]警告:启动处理程序时出错   [INFO] java.lang.ClassFormatError:类文件中不兼容的魔术值4022320623 com / teamlazerbeez / http / di / StartupListener

这个数字是十六进制表示法中的EFBFBDEF,显然不是CAFEBABE,字节序列是Java类文件的开头。 我只在主题上找到了thisthis,这让我相信在编写或读取类文件时编码出错了。

这是问题吗?如何强制maven读取/写入类,例如UTF-8编码? 什么一个好的编码?
我的java文件都以相同的方式编码:Eclipse表示ISO-8859-1,Notepad ++表示ANSI。

PS:我在使用Windows机器。

4 个答案:

答案 0 :(得分:4)

正如Joakim Erdfeldanswer所暗示的那样,其中一个插件正在摆弄构建。 罪魁祸首是maven-war-plugin v2.3,但仅限于以下情况:

在mavenized Ecipse项目(pom.xml中列出appengine-maven-plugin v1.7.5)的情况下启用了GAE特性会中断mvn appengine:devserver iff 以下条件适用:

  • 'default output folder'(在Eclipse项目的'Build Path'设置中)设置为src/main/webapp/WEB-INF/classes/(GAE Eclipse插件工作所需)
  • GAE插件决定将GAE-jar放入src/main/webapp/WEB-INF/lib/,即使这些jar已经在类路径中。

总之,maven-war-plugin不正确地将。{1}}中的.class和.jar文件复制到生成的.war文件中。在这个过程的某个地方,它错误地编码了这些文件。

答案 1 :(得分:3)

检查您的src/main/webapp/WEB-INF文件夹,它不应包含classes文件夹。

如果确实如此,则表示您可能错误配置了您的eclipse项目。

我们遇到的一个案例是开发人员导入maven项目并“作为Web应用程序”运行项目。他第一次这样做时,Eclipse会问他webapp文件夹的位置。如果你回答src/main/webapp那么Eclipse将把它的类放在那里,之后它会被maven弄乱。

要解决此问题,请从Eclipse中删除项目并删除src/main/webapp/WEB-INF/classes folder, then re-import the project

当Eclipse询问webapp文件夹的位置时,它位于target/yourproject-yourversion

答案 2 :(得分:1)

maven构建中的某些内容在compile之后和package阶段之前弄乱了类文件。

首先注释掉所有<plugins>,然后一次添加1个,直到构建再次中断。

确保你运行> mvn help:effective-pom以检查你的pom完全解析为父母pom之后的样子。

(实验)你甚至可以通过简单地使用项目信息报告命令行为依赖项报告来获取构建本身来告诉你类是否错误。

> mvn clean org.apache.maven.plugins:maven-project-info-reports-plugin:2.6:dependencies

答案 3 :(得分:1)

我发现this question也提到了无效的幻数EFBFBDEF。它似乎也建议您正确设置maven编码。使用以下属性:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

但我认为这只有在maven构建过程中获得encoding warning时才有用。