Eclipse如何自动编译我的项目而没有错误,但是当我运行Ant build.xml时 - >编译目标,构建失败,编译错误:
<MyClass> is not abstract and does not override abstract method <someMethod>
我理解这个错误消息,但似乎不是真的,因为1)Eclipse显示没有错误2)将此项目部署到服务器成功,并且该类可以正常工作。
那么这个问题怎么可能呢?
答案 0 :(得分:2)
你是否正在使用Eclipse的一些特殊扩展,比如Lombok(可能是扩展为你生成的东西)? 你在使用一些特殊的框架(可能是框架为你生成了一些类)?
您还需要了解的是Eclipse和Ant使用不同的编译器。 Eclipse有自己的编译器,它与Sun JDK或某些版本的Sun JDK的行为不同。可以阅读here这种行为的一个例子。但在我得出结论之前,我将检查我在Eclipse上的所有配置。
答案 1 :(得分:1)
您的Ant构建也可能与Eclipse构建的设置不同。不同的源文件夹,不同的JAR等。例如,您的Eclipse构建可能引用旧版本的第三方JAR,并且您的Ant构建引用了一个新版本,其中新的抽象方法被添加到您继承的类中
答案 2 :(得分:0)
因为Eclipse编译器存在细微差别。我也发现了一个bug,Javac抛出了(IMHO愚蠢的)错误,而Eclipse编译器能够像预期的那样编译它。
仅供参考:Eclipse使用不同的编译器(它自己的),因为在您键入时需要为增量构建优化一个。
创建一个测试用例,显示差异是真实的,并将其发送给eclipse团队。他们将调整编译器的行为。但是,我无法相信像Eclipse编译器这样的主要错误就像未实现的方法一样。因此,我假设您在为此创建测试用例时在设置中找到了错误。
答案 3 :(得分:0)
谢谢大家的快速解答。理解Eclipse使用不同的编译器非常有帮助,这解释了很多。
至于我的问题 - 我认为Java编译器是正确的,并且构建实际上有错误。经过仔细研究,发现旧版本的Apache Commons DBCP与Java 1.6不兼容。我确信我使用的是最新版本并查阅了错误的文档版本,其中说明已实施所需的方法。
现在和Eclipse一样。这个bug实际上很棘手。我设法编写了一个显示此错误的测试用例。我使用Java 1.6和Eclipse Helios for Java EE。我在Eclipse中创建了一个Java项目并添加了
com.springsource.org.apache.commons.pool-1.5.3.jar com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
到classpath(从SpringSource存储库下载这些JAR)。如您所见,Apache Commons DBCP是一个旧版本。 Java 1.6需要1.4 +版本。
在我的测试项目中,我扩展了org.apache.commons.dbcp.BasicDataSource,并另外说它应该实现javax.sql.DataSource。像这样:
import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;
public class MyDataSource extends BasicDataSource implements DataSource {
}
这里棘手的部分是BasicDataSource实现了DataSource接口。但是在1.6版本中,这个接口扩展了它,因此没有实现新的方法。再次显式添加“implements DataSource”应该导致和错误,Java编译器成功报告。但Eclipse在没有任何警告的情况下编译此代码,甚至可以运行。
这就是问题所在。看起来像Eclipse中的一个错误。