【发布时间】:2017-04-07 11:34:21
【问题描述】:
我刚开始使用 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];
- Java:1.8.0_73;
- 等级:2.14。
- 操作系统:Microsoft Windows 10 x64 Pro [版本 10.0.14393];
- Java:1.8.0_121;
- 分级:3.4.1。
- 操作系统: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 以在类路径中包含 Checker Framework。
据我了解,Gradle 在通过依赖管理提供所需的 Checker Framework 的 jar 时会自动执行第 1 步和第 2 步。尽管如此,我尝试了两种选择:
- 依赖管理:
我只是下载了示例项目并从根目录执行“gradle compileJava” GradleJava7Example 项目的。 - 在 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'
]
}
}
【问题讨论】:
-
我无法重现您的问题。当我尝试该示例时,输出包括行号。你能提供更多细节吗?什么操作系统,什么版本的 Java,什么版本的 gradle,您使用的是 GradleJava7Example 还是 GradleJava8Example,您使用的是 Checker Framework 发行版还是从 GitHub 克隆它等等?请给出一个完整的方法来重现问题,最好从安装 Checker Framework 开始。然后其他人可以帮助你。