在我使用Gradle(Windows 7,Java 1.7.0.15)构建的现有项目中,我已按如下方式升级了Mybatis库:
// MyBatis
compile "org.mybatis:mybatis:3.2.1"
compile "org.mybatis:mybatis-spring:1.2.0"
//compile "org.mybatis:mybatis:3.0.6"
//compile "org.mybatis:mybatis-spring:1.0.2"
现在,当我构建时,我收到以下错误:
11:38:37.308 [INFO] [org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler]
Compiling with JDK 6 Java compiler API.
11:38:39.147 [ERROR] [system.err] ...java:14: error: DateTimeHandler is not abstract and does not override abstract method getNullableResult(ResultSet,int) in BaseTypeHandler
11:38:39.153 [ERROR] [system.err] public class DateTimeHandler extends BaseTypeHandler<DateTime> {
11:38:39.274 [ERROR] [system.err] Note: Some input files use or override a deprecated API.
11:38:39.279 [ERROR] [system.err] Note: Recompile with -Xlint:deprecation for details.
11:38:39.284 [ERROR] [system.err] 1 error
我已经检查了一百次这个类,并且它已经覆盖了正确的方法(实际上Eclipse同意它没有显示错误)。
我不知道为什么当一切都应该在Java 7下时,正在使用内部Gradle类jdk6。有人知道这里发生了什么id?
Gradle不喜欢的课程:
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.joda.time.DateTime;
@MappedTypes(value = DateTime.class)
public class DateTimeHandler extends BaseTypeHandler<DateTime> {
public DateTimeHandler() {
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, DateTime parameter, JdbcType jdbcType) throws SQLException {
ps.setTimestamp(i, new java.sql.Timestamp((parameter.toDate()).getTime()));
}
@Override
public DateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName);
if (sqlTimestamp != null) {
return new DateTime(sqlTimestamp.getTime());
}
return null;
}
@Override
public DateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
java.sql.Timestamp sqlTimestamp = cs.getTimestamp(columnIndex);
if (sqlTimestamp != null) {
return new DateTime(sqlTimestamp.getTime());
}
return null;
}
}
但据我所知,它没有任何问题。正确的方法是过度的。
确定修复版本:
在方法中添加:
public DateTime getNullableResult(ResultSet rs,int columnIndex)抛出SQLException;
如果我在此方法上使用覆盖注释,但是没有注释,Gradle构建成功完成,则会出现Eclipse错误。如果删除该方法,Gradle会产生一个错误,指出该类需要覆盖具有该签名的方法(或者声明为抽象)。
所以虽然我的问题已得到解决,但我并不理解这个错误的本质。
答案 0 :(得分:1)
Gradle支持多种调用Java编译器的方法。其中之一是通过JDK 6 Java编译器API,它存在于JDK 6及更高版本中。 gradle -v
将告诉您哪个JDK用于执行Gradle。默认情况下,相同的JDK将用于编译Java代码。
关于编译错误,我需要更多信息来帮助(Gradle版本,源代码,compile
类路径的打印输出,可重现的示例等)。如果代码在Eclipse中编译但不在Gradle中编译,则可能是Gradle和Eclipse的配置不同,例如在编译类路径方面。