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

