启用Checker Framework后Maven编译孵化模块报错求助
Maven编译问题:启用Checker Framework后孵化模块警告转为错误
问题场景
我有一个Maven项目,当配置以下内容时可成功编译:
<fork>false</fork> <!-- fork的默认设置 --> <compilerArgs combine.children="append"> <arg>--enable-preview</arg> <arg>--add-modules</arg> <arg>jdk.incubator.vector</arg> </compilerArgs>
但因需使用Checker Framework,必须将<fork>设为true。修改配置为:
<fork>true</fork> <compilerArgs combine.children="append"> <arg>--enable-preview</arg> <arg>--add-modules</arg> <arg>jdk.incubator.vector</arg> </compilerArgs>
编译随即失败,错误信息如下:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project xxx-utils: Compilation failure: Compilation failure: [ERROR] using incubating module(s): jdk.incubator.vector [ERROR] using incubating module(s): jdk.incubator.vector [ERROR] using incubating module(s): jdk.incubator.vector
Maven调用栈:
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:1214) at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:193) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103) at java.lang.reflect.Method.invoke (Method.java:580) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)
引发异常的代码行:
throw new CompilationFailureException(warnings);
Maven传递给javac的命令行参数:
[DEBUG] Excutable: [DEBUG] /Library/Java/jdk-21.0.1.jdk/Contents/Home/bin/javac [DEBUG] Command line options: [DEBUG] -d /Users/xxx/code/xxx/utils/target/classes -classpath ... -sourcepath ... -s /Users/xxx/code/xxx/utils/target/generated-sources/annotations -processor org.checkerframework.checker.nullness.NullnessChecker -processorpath ... -g -parameters --release 21 -encoding UTF-8 -Xmaxerrs 10000 -Xmaxwarns 10000 -Awarns --enable-preview --add-modules jdk.incubator.vector
补充:移除Checker Framework相关配置后编译正常,完整配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <jdkToolchain> <version>21</version> </jdkToolchain> <fork>true</fork> <annotationProcessorPaths> <path> <groupId>org.checkerframework</groupId> <artifactId>checker</artifactId> <version>3.42.0</version> </path> </annotationProcessorPaths> <annotationProcessors> <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> </annotationProcessors> <compilerArgs combine.children="append"> <arg>-Xmaxerrs</arg> <arg>10000</arg> <arg>-Xmaxwarns</arg> <arg>10000</arg> <arg>-Awarns</arg> <arg>--enable-preview</arg> <arg>--add-modules</arg> <arg>jdk.incubator.vector</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg> <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg> <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg> </compilerArgs> <parameters>true</parameters> </configuration> </plugin>
问题原因
核心是Checker Framework的-Awarns参数会将所有注解处理器相关的警告升级为错误,包括JDK孵化模块的使用警告。当<fork>设为true时,javac以独立进程运行,Checker Framework的警告处理逻辑会捕获到孵化模块的提示并将其转为错误,导致编译失败。
修复方案
方案1:忽略孵化模块警告
在compilerArgs中添加Checker Framework的专属参数-AskipUsesIncubating,让它跳过对孵化模块使用的检查:
<compilerArgs combine.children="append"> <!-- 保留原有参数 --> <arg>-AskipUsesIncubating</arg> </compilerArgs>
这个参数会告诉Checker Framework忽略所有关于使用孵化模块的警告,避免它们被转为错误。
方案2:调整Checker警告策略
如果不需要将所有Checker警告转为错误,可以移除-Awarns参数,或者替换为具体的Checker规则警告选项,只将特定类型的警告转为错误,例如:
<!-- 替换原有-Awarns --> <arg>-Awarns=org.checkerframework.checker.nullness.NullnessChecker</arg>
这样只会将NullnessChecker相关的警告转为错误,不会影响孵化模块的提示。
内容的提问来源于stack exchange,提问作者morpheus
相关产品推荐
相关产品推荐

