考虑一下这个github存储库。 https://github.com/dfabulich/bazel-checker-framework-bug
它包含一个明显违反X.java
注释规则的示例@Nonnull
文件。
import javax.annotation.Nonnull;
public class X {
public static void main(String[] args) {
new X().exec();
}
public void exec() {
System.out.println(this.method());
}
@Nonnull
private String method() {
return null;
}
}
WORKSPACE
文件只包含checker.jar
。
maven_jar(
name="checker",
artifact="org.checkerframework:checker:2.3.1"
)
BUILD
文件使用配置为java_plugin
的检查器框架调用编译器。
java_library(
name='x',
srcs=['X.java'],
deps=['@checker//jar'],
plugins=['checker'],
)
java_plugin(
name='checker',
deps=['@checker//jar'],
processor_class='org.checkerframework.checker.nullness.NullnessChecker',
)
当我bazel build x
时,构建失败并显示以下错误:
错误:调用类org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory的构造函数时的InvocationTargetException;潜在原因:java.lang.StackOverflowError; Checker Framework崩溃了。请报告崩溃。要查看完整堆栈跟踪,请使用-AprintErrorStack
调用编译器
当我在plugins
文件中注释掉BUILD
行时,构建成功且没有错误。 (这是有道理的,但我最终希望Checker Framework在return.type.incompatible
错误的情况下使这个版本失败。)
我在这里弄错了吗?这是Bazel的一个错误吗?
答案 0 :(得分:3)
我在bazel-discuss mailing list上得到了一个很好的答案,告诉我尝试NullAway,这是一个依赖于Checker Framework的Error Prone插件。
github repo现在包含一个使用NullAway的工作示例,就像这样。
WORKSPACE:
maven_jar(
name='jsr305',
artifact='com.google.code.findbugs:jsr305:3.0.2',
)
maven_jar(
name="nullaway",
artifact="com.uber.nullaway:nullaway:0.3.2"
)
maven_jar(
name="guava",
artifact="com.google.guava:guava:22.0",
)
BUILD:
java_library(
name='x',
srcs=['X.java'],
deps=['@jsr305//jar'],
plugins=['nullaway'],
javacopts=[
'-Xep:NullAway:ERROR',
'-XepOpt:NullAway:AnnotatedPackages=com.example',
],
)
java_plugin(
name='nullaway',
deps=[
'@nullaway//jar',
'@guava//jar',
],
)
(对番石榴的依赖是不幸的;它是必需的,因为without Guava, NullAway refuses to load。)