You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:24:58