在编译时执行静态分析、错误检测或建议可能的优化。插件包括500多个预定义错误检查,并允许第三方和自定义插件。检查问题后,ErrorProne可以通过警告显示问题或使用预定义的解决方案自动修改代码。ErrorProne支持Java8、11和17,可用于修复错误或进行大规模重构。文档中提供了使用Maven、Bazel、Ant和Grandle的安装和配置教程。ErrorProne需要在编译器中配置为注解处理器(annotationprocessor)。下面是通过Maven创建测试工程的例子:org.apache.maven.pluginsmaven-compiler-plugin3.10.1版本><配置>17UTF-8-XDcompilePolicy=simple-Xplugin:ErrorPronecom.google.errorproneerror_prone_core2.15.0接下来,您可以创建一个示例类。以下方法使用equals方法比较两个数组。更准确地说,这里比较的是对象本身,而不是数组的内容。publicbooleancompare(StringfirstList[],StringsecondList[]){returnfirstList.equals(secondList);}执行mvncleanverify触发ErrorProne分析,运行结果报错信息如下:[ERROR]Failedto执行目标org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile(default-compile)onprojectErrorProne:Compilationfailure[ERROR].../ErrorProne/src/main/java/org/example/Main.java:[5,28][ArrayEquals]用于比较数组的引用相等性[错误](参见https://errorprone.info/bugpattern/ArrayEquals)[错误]你的意思是“返回Arrays.equals(firstList,secondList);'?报告了ArrayEquals错误,ErrorProne的建议是修改实现以比较数组的内容而不是比较对象。返回Arrays.equals(firstList,secondList);错误报告不仅可以帮助改进代码,还可以让ErrorProne自动应用解决方案。-XepPatchChecks参数的应用程序应包含以逗号分隔的错误模式列表,在上述情况下,此代码仅使用ArrayEquals解决方案。-XepPatchLocation参数用于具体定位解决方案文件位置。在当前情况下,源文件被修改为:执行mvncleanverify后class文件自动修改为:publicbooleancompare(StringfirstList[],StringsecondList[]){returnArrays.equals(firstList,secondList);文档提供了有关命令行标志的更多信息。除了内置的bug模式,你还可以使用SLF4J等第三方发布的插件,或者创建自定义插件。内置规则的源代码提供了各种不同的示例模板,可用于定义插件。例如,自定义一个ErrorProne插件,用新的JUnit5@BeforeEach注释替换旧的@BeforeJUnit注释。与前面的示例不同,自定义的ErrorProne插件应该放在Maven模块中。ErrorProne通过服务加载器机制加载错误检测。这类场合通常需要进行一定的配置,但谷歌的AutoService项目借助@AutoService注解简化了配置。@BugPattern注释用于定义错误的名称、描述和严重性。在下面的示例中,@Before注释将返回Description.NO_MATCH如果没有找到@Before注释,否则SuggestedFix将用@BeforeEach注释替换@Before注释。@AutoService(BugChecker.class)@BugPattern(name="BeforeCheck",summary="JUnit4的@Before被JUnit5的@BeforeEach取代",severity=BugPattern.SeverityLevel.SUGGESTION)publicclassBeforeCheckextendsBugCheckerimplementsBugChecker.AnnotationTreeMatcher{privatestaticfinalMatchermatcher=isType("org.junit.Before");@OverridepublicDescriptionmatchAnnotation(AnnotationTreeannotationTree,VisitorStatevisitorState){if(!matcher.matches(annotationTree,visitorState)){返回Description.NO_MATCH;}returndescribeMatch(annotationTree,SuggestedFix.replace(annotationTree,"@BeforeEach"));}}构建自定义ErrorProne插件的时候都是需要ErrorProne和AutoService依赖的。com.google.errorproneerror_prone_annotations<版本>2.15.0com.google.errorproneerror_prone_check_api2.15.0com.google.auto.serviceauto-service-annotations1.0.1AutoService应配置为注解处理器。com.google.auto.serviceauto-service1.0.1现在,自定义的ErrorProne插件可以通过mvninstall命令安装到本地Maven仓库中。执行命令后,示例项目应配置为使用新的自定义插件作为注释处理器。org.example.custom.pluginErrorProneBeforeCheck1.0-SNAPSHOT新的BeforeCheck应该被添加到容易出错的分析中。-XDcompilePolicy=simple-Xplugin:ErrorProne-XepPatchChecks:BeforeCheck-XepPatchLocation:IN_PLACE添加示例测试类,带有@Before和@BeforeEach两个注解为了。publicclassErrorProneTest{@Beforevoidbefore(){}@BeforeEachvoidbeforeEach(){}}在运行mvnverify时,新的自定义ErrorProne插件会将@Before注释替换为@BeforeEach注释。publicclassErrorProneTest{@BeforeEachvoidbefore(){}@BeforeEachvoidbeforeEach(){}}ErrorProne使用的Java内部当前是隐藏的,可能导致以下错误:java.lang.IllegalAccessError:classcom.google。errorprone.BaseErrorProneJavaCompiler(在未命名模块@0x1a6cf771中)无法访问类com.sun.tools.javac.api.BasicJavacTask(在模块jdk.compiler中),因为模块jdk.compiler不会将com.sun.tools.javac.api导出到未命名模块@0x1a6cf771Maven的解决方案是通过在项目根目录下创建一个.mvn目录来暴露Java内部,并在该目录下创建一个jvm.config文件,配置如下:--add-exportsjdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED--add-exportsjdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED--add-opensjdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED--add-opensjdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED也可以在Maven编译插件的pom文件中添加--add-exports和--add-opens参数配置:<插件>org.apache.maven.pluginsmaven-compiler-plugin3.10.1--add-exportsjdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED...有关使用ErrorProne与Bazel、Ant和Gradle的更多信息可以在安装指南