maven-war-plugin:2.3执行war目标失败,咨询原因与解决办法
错误详情
在项目Project上执行目标
org.apache.maven.plugins:maven-war-plugin:2.3:war(default-war)失败:执行目标org.apache.maven.plugins:maven-war-plugin:2.3:war的default-war失败:由于API不兼容,无法加载插件org.apache.maven.plugins:maven-war-plugin:2.3中的mojo 'war':org.codehaus.plexus.component.repository.exception.ComponentLookupException: nullrealm = plugin>org.apache.maven.plugins:maven-war-plugin:2.3
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/C:/Users/Ram%20Ishwer%20Kumar/.m2/repository/org/apache/maven/plugins/maven-war-plugin/2.3/maven-war-plugin-2.3.jar
...(其余依赖URL略): ExceptionInInitializerError: 无法访问私有最终字段java.util.Comparator java.util.TreeMap.comparator:模块java.base未向未命名模块@3fe512d2开放"java.util"权限
-> [帮助1]
错误原因
maven-war-plugin:2.3是2013年发布的老旧版本,依赖的组件(如XStream 1.4.3、Plexus系列库)未适配Java 9及以上版本的模块化系统(JPMS)。- Java 9及以上版本引入的模块系统限制了反射对核心类私有成员的访问,插件试图通过反射访问
java.util.TreeMap的私有字段comparator,但核心模块java.base未向未命名模块开放该权限,导致插件加载失败。
解决方法
优先升级maven-war-plugin版本
在项目pom.xml中更新插件至兼容Java 9+的稳定版本(推荐3.3.2及以上):<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build>执行
mvn clean package重新构建项目。降级至Java 8环境
若暂时无法升级插件,可将项目的编译、运行环境切换到Java 8——Java 8没有模块化限制,旧版本插件可正常工作。临时添加JVM参数绕过限制(不推荐长期使用)
运行Maven时添加以下参数,临时开放核心模块的反射访问权限:mvn clean package --add-opens java.base/java.util=ALL-UNNAMED此方法仅作为临时应急方案,无法从根源解决兼容性问题。
内容的提问来源于stack exchange,提问作者Ram Ishwer Kumar

