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

Maven构建扩展java.base项目时--patch-module标记无效求助

问题

构建扩展java.lang包的项目时,执行mvn clean compile提示Maven 3.9.0存在无效标记--patch-module,但直接执行javac --patch-module java.base=src <path-to-source>可正常编译。

原因是Maven使用的com.sun.tools.javac.api.JavacTool解析<compilerArgs>时仅使用BASIC选项组,而--patch-module属于FILEMANAGER组,因此触发非法标记异常。

需求:不使用javac命令行工具完成CI流水线,让项目在Maven中正常构建。

项目结构

src -> main -> java -> java.lang -> [你的类文件]

pom.xml相关配置

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
            <source>${java.source.sdk}</source>
            <target>${java.source.sdk}</target>
            <compilerArgs>
                <arg>--patch-module java.base=src</arg>
            </compilerArgs>
        </configuration>
    </plugin>
</plugins>

环境信息

  • Maven版本:3.9.0(使用3.10.1结果相同)
  • Java版本:18(使用19结果相同)

错误信息

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project commons-bootstrap: Fatal error compiling: error: invalid flag: --patch-module java.base=src -> [Help 1]

异常堆栈

Caused by: java.lang.IllegalArgumentException: error: invalid flag: --patch-module java.base=src
    at com.sun.tools.javac.main.Arguments.reportDiag (Arguments.java:889)
    at com.sun.tools.javac.main.Arguments.doProcessArgs (Arguments.java:395)
    at com.sun.tools.javac.main.Arguments.processArgs (Arguments.java:347)
    at com.sun.tools.javac.main.Arguments.init (Arguments.java:246)
    at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:191)
    at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:119)
    at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:68)
    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:135)
    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:182)
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:1209)
    at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:198)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
    at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
    at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
    at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
    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:260)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:172)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:100)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:821)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:270)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
    at java.lang.reflect.Method.invoke (Method.java:577)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
解决方案

有两种有效方法解决该问题:

方法1:拆分--patch-module参数

将<compilerArgs>中的单个参数拆分为两个独立的<arg>节点,适配JavacTool的参数解析逻辑:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
            <source>${java.source.sdk}</source>
            <target>${java.source.sdk}</target>
            <compilerArgs>
                <arg>--patch-module</arg>
                <arg>java.base=src/main/java</arg>
            </compilerArgs>
        </configuration>
    </plugin>
</plugins>

注意:路径建议使用src/main/java而非src,避免包含非源码目录文件。

方法2:使用Maven Compiler Plugin原生patchModule配置

从maven-compiler-plugin 3.8.0版本开始,官方支持patchModule配置项,无需手动添加compilerArgs,更符合Maven规范:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
            <source>${java.source.sdk}</source>
            <target>${java.source.sdk}</target>
            <patchModules>
                <patchModule>
                    <module>java.base</module>
                    <path>src/main/java</path>
                </patchModule>
            </patchModules>
        </configuration>
    </plugin>
</plugins>

该方式会自动处理参数传递,避免JavacTool的选项组解析问题,推荐使用。

内容的提问来源于stack exchange,提问作者NemanjaSRB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:14