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

Maven使用ECJ编译器时出现--patch-module选项不识别错误求助

问题分析与解决方案

是否为Bug?归属方是谁?

这是bug,归属方是org.codehaus.plexus:plexus-compiler-eclipse组件。原因如下:

  • Maven Compiler Plugin编译测试类时,会自动添加--patch-module参数,用于让测试代码访问主模块的内部API
  • 旧版本的plexus-compiler-eclipse(比如你使用的2.12.1)没有将javac风格的--patch-module参数转换为ECJ可识别的格式,直接传递给ECJ后触发了不识别的错误
  • 尽管ECJ本身支持模块补丁,但它的参数格式、传递逻辑与javac不同,而plexus-compiler-eclipse作为Maven与ECJ的中间适配层,没有完成对应参数的转换适配

解决办法

办法1:升级plexus-compiler-eclipse版本

升级到支持--patch-module参数转换的版本(2.13.0及以上),新版本会自动完成javac参数到ECJ参数的适配。修改pom.xml中对应的依赖:

<dependency>
    <groupId>org.codehaus.plexus</groupId>
    <artifactId>plexus-compiler-eclipse</artifactId>
    <version>2.13.0</version>
</dependency>

办法2:手动配置测试编译的编译器参数(适用于无法升级组件的场景)

在maven-compiler-plugin中为testCompile目标添加配置,禁用自动生成的--patch-module参数,改用ECJ支持的补丁模块参数格式:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <compilerId>eclipse</compilerId>
        <release>16</release>
        <compilerArguments>
            <properties>${project.basedir}/.settings/org.eclipse.jdt.core.prefs</properties>
        </compilerArguments>
    </configuration>
    <executions>
        <execution>
            <id>default-testCompile</id>
            <goals>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <compilerArgs>
                    <!-- 改用ECJ的补丁模块参数格式,替换为你的主模块ID -->
                    <arg>-patch-module ${project.artifactId}=${project.build.testOutputDirectory}</arg>
                </compilerArgs>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-eclipse</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt</groupId>
            <artifactId>ecj</artifactId>
            <version>3.31.0</version>
        </dependency>
    </dependencies>
</plugin>

办法3:临时切换为javac编译测试代码

如果仅测试阶段遇到问题,可以保持主代码用ECJ编译,测试代码临时切换回javac:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <compilerId>eclipse</compilerId>
        <release>16</release>
        <compilerArguments>
            <properties>${project.basedir}/.settings/org.eclipse.jdt.core.prefs</properties>
        </compilerArguments>
    </configuration>
    <executions>
        <execution>
            <id>default-testCompile</id>
            <goals>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <compilerId>javac</compilerId>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-compiler-eclipse</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt</groupId>
            <artifactId>ecj</artifactId>
            <version>3.31.0</version>
        </dependency>
    </dependencies>
</plugin>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:30:51