我刚开始使用 Checker Framework,并且遇到了一个问题,该问题完全可以在该框架作者的示例项目之一上重现。该项目可在此处获得: https ://github.com/typetools/checker-framework/tree/master/docs/examples/GradleExamples
当我从 root 运行此命令时:
>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 台机器上实现了这种行为:
- 操作系统:Microsoft Windows 7 x64 Ultimate SP1 [版本 6.1.7601];
- 爪哇:1.8.0_73;
- 梯度:2.14。
- 操作系统:Microsoft Windows 10 x64 Pro [版本 10.0.14393];
- 爪哇:1.8.0_121;
- 摇篮:3.4.1。
- 操作系统:Microsoft Windows 7 x64 Ultimate SP1 [版本 6.1.7601];
- 爪哇:1.8.0_121;
- 摇篮:3.4.1。
只有在使用 Gradle 运行时才会出现行号和类名的缺失。我还尝试使用 Maven 和 Javac 从命令行运行检查器,它运行良好。
要使用 Gradle 配置 Checker Framework,我按照手册中的步骤操作。有3个步骤:
- 下载框架;
- 解压后创建一个 checker-framework 目录;
- 将 Gradle 配置为在类路径中包含 Checker Framework。
据我了解,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'
]
}
}