我想知道在java 17中使用检查器框架的正确方法。我看了一下文档,最后在这里:https://github.com/typetools/checker-framework/blob/master/docs/examples/MavenExample/pom.xml
但它似乎不起作用。这是我的诗:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>learn</artifactId>
<groupId>tutorial</groupId>
<version>1.0.0-Final</version>
</parent>
<artifactId>checkerframework</artifactId>
<name>checkerframework</name>
<packaging>jar</packaging>
<properties>
<checkerframework.version>3.22.1</checkerframework.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.checkerframework/checker -->
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker</artifactId>
<version>${checkerframework.version}</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.checkerframework/checker-qual -->
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
<version>${checkerframework.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- Must fork or else JVM arguments are ignored. -->
<fork>true</fork>
<release>17</release>
<compilerArgs combine.children="append">
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
我省略了其他jdk的配置文件。然而,当我在IntelliJ中单击运行按钮时,它不会抛出警告。或者它甚至不显示黄色下划线,表示检查框架已发现此问题或类似的内容。
我在这里错过了什么?
我以前使用过lombok,它并不麻烦。只需添加依赖项,IJ将负责处理。
那么我如何在这里实现呢?我看到修改IJ的注释设置,但我认为这是多余的,特别是我希望它是跨平台的。所以我寻找纯基于脚本。
这是我用来检查的Main类:
public class Main {
public static @Positive int positiveInteger;
public static void main(final String[] args) {
positiveInteger = -4;
System.out.println(positiveInteger);
// should show warning underline or something on positiveInteger ???
}
}
我也试过添加所有注释处理器,如图所示(https://www.baeldung.com/checker-framework),但也失败了:
您必须添加您想要使用的检查器框架的注释处理器。此外,要使它与JDK16+一起工作,您必须包含一些add- opened to JDK参数。
如果您也在使用Lombok, maven编译器插件配置可能看起来像这样:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- Must fork or else JVM arguments are ignored. -->
<compilerArgument>-Xlint:all</compilerArgument>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.checkerframework</groupId>
<artifactId>checker</artifactId>
<version>${checker-framework.version}</version>
</path>
</annotationProcessorPaths>
<annotationProcessors>
<annotationProcessor>
lombok.launch.AnnotationProcessorHider$AnnotationProcessor
</annotationProcessor>
<annotationProcessor>
org.checkerframework.checker.nullness.NullnessChecker
</annotationProcessor>
</annotationProcessors>
<compilerArgs combine.children="append">
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
则在运行mvn compile
时将使用选中的检查器(本例中为NullnessChecker
)。为您想要使用的每个检查器添加一个annotationProcessor
元素。您可以在手册(https://checkerframework.org/manual)中找到检查器框架中所有的检查器。
在示例中,链接检查器配置是在checkerframework
配置文件下定义的。