0

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は、クラスがそのシグネチャでメソッドをオーバーライドする必要がある(または抽象として宣言される)必要があるというエラーを生成します。

したがって、私の問題は修正されましたが、このエラーの性質を本当に理解していません。

4

1 に答える 1

1

Gradleは、Javaコンパイラを呼び出す複数の方法をサポートしています。それらの1つは、JDK6以降に存在するJDK6JavaコンパイラAPIを介したものです。gradle -vGradleの実行に使用されているJDKがわかります。デフォルトでは、同じJDKがJavaコードのコンパイルに使用されます。

コンパイルエラーに関しては、役立つ情報(Gradleバージョン、ソースコード、compileクラスパスの印刷、再現可能な例など)が必要になります。コードがEclipseでコンパイルされ、Gradleでコンパイルされない場合、たとえばコンパイルクラスパスに関して、GradleとEclipseの構成が異なる可能性があります。

于 2013-03-27T12:15:59.900 に答える