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
相关产品推荐
相关产品推荐

