我在一个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类文件的开头。
我只在主题上找到了this和this,这让我相信在编写或读取类文件时编码出错了。
这是问题吗?如何强制maven读取/写入类,例如UTF-8编码?
什么是一个好的编码?
我的java文件都以相同的方式编码:Eclipse表示ISO-8859-1,Notepad ++表示ANSI。
PS:我在使用Windows机器。
答案 0 :(得分:4)
正如Joakim Erdfeld的answer所暗示的那样,其中一个插件正在摆弄构建。 罪魁祸首是maven-war-plugin v2.3,但仅限于以下情况:
在mavenized Ecipse项目(pom.xml
中列出appengine-maven-plugin v1.7.5)的情况下启用了GAE特性会中断mvn appengine:devserver
iff 以下条件适用:
src/main/webapp/WEB-INF/classes/
(GAE Eclipse插件工作所需)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时才有用。