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
私はクラスを100回チェックしましたが、それは正しいメソッドをオーバーライドします(実際、Eclipseはエラーを表示しないという点で同意しています)。
すべてがJava7である必要があるのに、なぜ内部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;
}
}
しかし、私が見る限り、それは何も悪いことではありません。正しいメソッドは上書きされます。
OKはビルドを修正しました:
メソッドに追加:
public DateTime getNullableResult(ResultSet rs、int columnIndex)はSQLExceptionをスローします。
このメソッドでオーバーライドアノテーションを使用するとEclipseエラーが発生しますが、アノテーションがないとGradleビルドは正常に完了します。メソッドが削除されると、Gradleは、クラスがそのシグネチャでメソッドをオーバーライドする必要がある(または抽象として宣言される)必要があるというエラーを生成します。
したがって、私の問題は修正されましたが、このエラーの性質を本当に理解していません。