Я пытаюсь реализовать прототип для Checker Framework .Я итерировал эту проблему на https://groups.google.com/forum/#!topic/checker-framework-discuss/DL1POFtYUh8, но здесь я расскажу о проблемах, так как это действительно проблема maven-compiler-plugin, а не проблема Checker.
Iя работаю со следующим POM:
<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>
<groupId>com.example</groupId>
<artifactId>checkerExperiments</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- These properties will be set by the Maven Dependency plugin -->
<annotatedJdk>${org.checkerframework:jdk8:jar}</annotatedJdk>
</properties>
<dependencies>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>jdk8</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- This plugin will set properties values using dependency
information -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<fork>true</fork>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<Xmaxerrs>10000</Xmaxerrs>
<Xmaxwarns>10000</Xmaxwarns>
</compilerArguments>
<annotationProcessorPaths>
<path>
<groupId>org.checkerframework</groupId>
<artifactId>checker</artifactId>
<version>2.11.0</version>
</path>
</annotationProcessorPaths>
<annotationProcessors>
<!-- Add all the checkers you want to enable here -->
<annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor>
</annotationProcessors>
<compilerArgs combine.children="append">
<!-- location of the annotated JDK, which comes from a Maven dependency -->
<arg>-Xbootclasspath/p:${annotatedJdk}</arg>
<arg>-Xbootclasspath/p:$settings.localRepository/com/google/errorprone/javac/$javac.version/javac-$javac.version.jar</arg>
<!-- -Awarns turns type-checking warnings into errors. -->
<arg>-Awarns</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-dependency-plugin
</artifactId>
<versionRange>
[2.8,)
</versionRange>
<goals>
<goal>properties</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Когда я запускаю mvn -X clean package
, я получаю в качестве следующей командной строки:
[DEBUG] Command line options:
[DEBUG] -d <homepath>\workspace-2019-09\checkerExperiments\target\classes -classpath <homepath>\workspace-2019-09\checkerExperiments\target\classes;<homepath>\.m2\repository\org\checkerframework\checker-qual\2.11.0\checker-qual-2.11.0.jar;<homepath>\.m2\repository\org\checkerframework\jdk8\2.11.0\jdk8-2.11.0.jar; -sourcepath <homepath>\workspace-2019-09\checkerExperiments\src\main\java;<homepath>\workspace-2019-09\checkerExperiments\target\generated-sources\annotations; <homepath>\workspace-2019-09\checkerExperiments\src\main\java\checkerExperiments\Stuff.java -s <homepath>\workspace-2019-09\checkerExperiments\target\generated-sources\annotations -processor org.checkerframework.checker.nullness.NullnessChecker -processorpath <homepath>\.m2\repository\org\checkerframework\checker\2.11.0\checker-2.11.0.jar; -g -nowarn -target 1.8 -source 1.8 -bootclasspath /p:$settings.localRepository/com/google/errorprone/javac/$javac.version/javac-$javac.version.jar -Awarns
Уведомлениечто это приводит только к одному из значений bootclasspath в командной строке.
Это приводит к следующему:
[ERROR] An exception has occurred in the compiler (1.8.0_152). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.annotation.Annotation not found
Хорошо, тогда кто-то сказал, что мне нужен "-JX" вместо«-X», поэтому я изменил две строки в pom на:
<arg>-J-Xbootclasspath/p:${annotatedJdk}</arg>
<arg>-J-Xbootclasspath/p:$settings.localRepository/com/google/errorprone/javac/$javac.version/javac-$javac.version.jar</arg>
Это приводит к следующей командной строке:
[DEBUG] Command line options:
[DEBUG] -d <homepath>\workspace-2019-09\checkerExperiments\target\classes -classpath <homepath>\workspace-2019-09\checkerExperiments\target\classes;<homepath>\.m2\repository\org\checkerframework\checker-qual\2.11.0\checker-qual-2.11.0.jar;<homepath>\.m2\repository\org\checkerframework\jdk8\2.11.0\jdk8-2.11.0.jar; -sourcepath <homepath>\workspace-2019-09\checkerExperiments\src\main\java;<homepath>\workspace-2019-09\checkerExperiments\target\generated-sources\annotations; <homepath>\workspace-2019-09\checkerExperiments\src\main\java\checkerExperiments\Stuff.java -s <homepath>\workspace-2019-09\checkerExperiments\target\generated-sources\annotations -processor org.checkerframework.checker.nullness.NullnessChecker -processorpath <homepath>\.m2\repository\org\checkerframework\checker\2.11.0\checker-2.11.0.jar; -g -nowarn -target 1.8 -source 1.8 -Xmaxerrs 10000 -Xmaxwarns 10000 -Awarns
У которой вообще нет параметра bootclasspath.
Я уверен, что мне нужно всего лишь простое изменение этого, но я просто не могу понять это.