我看到一个问题,即由Maven构建的给定源文件生成的类文件与Eclipse构建的文件不同。
Eclipse构建器正在优化以下方法:
public SomeClass clone() {
SomeClass clone = (SomeClass) super.clone();
return clone;
}
这种方法显然是不必要的,但我没有选择更改源,因为它是生成的。
Eclipse使用哪个构建器来编译这些类?我正在使用m2Eclipse插件,我认为它只是调用Maven来执行构建。为什么Eclipse认为它需要使用不同的构建器执行另一个构建?我是否可以禁用此Eclipse构建器或将其配置为阻止优化?
更新
我找到了Eclipse bug report来描述正在发生的事情。为了澄清,它实际上并不是删除任何东西的Eclipse编译器,它只是没有引入标准JDK编译器引入的合成“桥接”方法。错误报告标记为已解决 - 不会修复。
在Maven构建器运行后,我仍然没有找到阻止Eclipse构建器运行的方法。但我们的修复是修改代码生成器以向生成的代码添加显式的serialVersionUID。
答案 0 :(得分:1)
如果为项目配置,您可以尝试禁用Java Builder
。您可以点击Builders
- >中的Project
标签进行检查。 Properties
。
来自Eclipse帮助...
Java构建器使用自己的编译器构建Java程序( Eclipse Compiler for Java)实现Java语言 说明书
答案 1 :(得分:1)
我没有Eclipse 3.7,但我希望自3.6以来这些事情没有改变。如果您打开属性 - >在您的项目上,您应该看到Maven Builder是最后的,或者至少在Java Builder之后。这意味着当Maven Builder看到您的Java源文件时,它们已经被编译。顺便说一下,您配置的外部Maven仅在您执行Run as - >时使用。而不是在使用Maven构建时。
所有这一切都是说你所看到的可能是这样的事实:当你从Eclipse中编译时,使用内部Java编译器,而当你从命令行运行Maven时,我希望使用JDK编译器,取决于您安装的内容。我认为你无法改变这种状况。您可以尝试的一件事是通过添加类似
之类的内容在POM中指定要兼容的Java版本来确保它们的行为尽可能接近。<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
到您的构建部分。
我不得不说我期望Java编译器不允许从类中删除公共方法,即使它们没用。