Checker Framework の使用を開始したばかりで、このフレームワークの作成者によるサンプル プロジェクトの 1 つで正確に再現可能な問題があります。このプロジェクトはこちらから入手できます: https://github.com/typetools/checker-framework/tree/master/docs/examples/GradleExamples
ルートからこのコマンドを実行すると:
>gradle compileJava
私はこのコンパイル出力を受け取ります:
public static /*@Nullable*/ Object nullable = null;
^
required: @Initialized @NonNull Object
list.add(null); // error on this line
^
required: @Initialized @NonNull String
2 errors
:compileJava FAILED
ご覧のとおり、クラス名、コードの行番号など、エラーが発生した場所に関する情報はありません。公式マニュアルには、出力形式を適切に変更できるコンパイラパラメーターに関する情報が見つかりませんでした。エラーメッセージは次のようになります。
~\GradleExample.java:33 error: ';' expected
アップデート:
3 台のマシンでこの動作を実現します。
- OS: Microsoft Windows 7 x64 Ultimate SP1 [バージョン 6.1.7601];
- Java: 1.8.0_73;
- グラドル: 2.14.
- OS: Microsoft Windows 10 x64 Pro [バージョン 10.0.14393];
- Java: 1.8.0_121;
- グラドル: 3.4.1.
- OS: Microsoft Windows 7 x64 Ultimate SP1 [バージョン 6.1.7601];
- Java: 1.8.0_121;
- グラドル: 3.4.1.
行番号とクラス名がないのは、Gradle で実行している場合のみです。また、コマンド ラインから Maven と Javac を使用してチェッカーを実行しようとしましたが、完全に機能しました。
Gradle で Checker Framework を構成するには、マニュアルの手順に従いました。3 つのステップがあります。
- フレームワークをダウンロードします。
- それを解凍して、チェッカー フレームワーク ディレクトリを作成します。
- クラスパスに Checker Framework を含めるように Gradle を構成します。
私が理解しているように、Gradle は依存関係管理を通じて必要な Checker Framework の jar を提供するときに、ステップ 1 と 2 を自動的に実行します。それにもかかわらず、私は両方のオプションを試しました:
- 依存関係の管理:
サンプル プロジェクトをダウンロードし、GradleJava7Example プロジェクトのルートから「gradle compileJava」を実行しました。 - gradleビルドファイルに手動でパスを書く:
allprojects {
tasks.withType(JavaCompile).all { JavaCompile compile ->
compile.options.compilerArgs = [
'-processor', 'org.checkerframework.checker.nullness.NullnessChecker',
'-processorpath', "C:\\checker-framework-2.1.10\\checker\\dist\\checker.jar",
"-Xbootclasspath/p:C:\\checker-framework-2.1.10\\checker\\dist\\jdk8.jar",
'-classpath', 'C:\\checker-framework-2.1.10\\checker\\dist\\checker.jar;C:\\checker-framework-2.1.10\\checker\\dist\\javac.jar'
]
}
}