【问题标题】:Proper checker framework config for mavenmaven 的正确检查器框架配置
【发布时间】:2022-06-13 16:17:06
【问题描述】:

我想知道在 java 17 中使用检查器框架的正确方法。我查看了文档并最终来到这里:https://github.com/typetools/checker-framework/blob/master/docs/examples/MavenExample/pom.xml

但它似乎不起作用。这是我的pom:

<?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 中的运行按钮时,它不会引发警告。或者它甚至没有显示黄色下划线,说明检查框架发现了这个问题或类似的东西。

我在这里错过了什么?

我以前用过龙目岛,这并不麻烦。只需添加依赖项,IJ 将负责处理。

那么我怎样才能在这里实现呢?我看到修改 IJ 的注释设置,但我认为这是一个矫枉过正,特别是我希望这是跨平台的。所以我寻找纯粹的脚本。

这是我用来检查的主要课程:

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),但这也失败了:

【问题讨论】:

    标签: maven java-17 checker-framework


    【解决方案1】:

    您必须添加要使用的检查器框架的注释处理器。此外,要使其与 JDK16+ 一起使用,您必须在 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) 中找到 Checker Framework 的所有检查器。

    在示例中,您链接的检查器配置是在checkerframework 配置文件下定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2012-09-30
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多