2

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

当我运行时,mvn appengine:devserver我最终得到一个错误,告诉我无法加载我的类:

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

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

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

PS:我在Windows机器上。

4

4 回答 4

4

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

在 mavenized Ecipse 项目(其中appengine-maven-plugin v1.7.5列在 中)上启用 GAE 特性将在以下条件适用pom.xml时中断运行:mvn appengine:devserver

  • “默认输出文件夹”(在 Eclipse 项目的“构建路径”设置中)设置为src/main/webapp/WEB-INF/classes/(GAE Eclipse 插件工作所需)
  • GAE 插件决定将 GAE-jars 放入 中src/main/webapp/WEB-INF/lib/,即使这些 jars 已经在类路径中。

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

于 2013-03-07T15:56:52.813 回答
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.

于 2013-12-11T12:09:42.137 回答
1

compile在阶段之后和之前,您的 Maven 构建中的某些东西会弄乱类文件package

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

当你的 pom 完全解析为父 pom 时,一定要跑去> mvn help:effective-pom检查它的样子。

(实验性)您甚至可以通过简单地使用 project-info-reports 命令行获取依赖项报告来让构建本身告诉您类是否不好。

> mvn clean org.apache.maven.plugins:maven-project-info-reports-plugin:2.6:dependencies
于 2013-03-06T14:48:19.640 回答
1

我发现这个问题也提到了无效的幻数 EFBFBDEF。它似乎还建议您正确设置 Maven 编码。使用以下属性:

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

但我认为这只有在您在 Maven 构建过程中收到编码警告时才有帮助。

于 2013-03-06T15:27:44.563 回答