NetBeans 13搭配Tomcat 10运行Maven项目时打包错误求助
解决Maven War插件2.3与高版本JDK兼容问题
问题描述
已安装NetBeans、Tomcat 10,Tomcat可在localhost正常运行,JDK环境变量配置完成,pom.xml中配置了Maven插件,但创建并运行示例项目时出现以下错误:
--- maven-war-plugin:2.3:war (default-war) @ mavenproject1 --- Error injecting: org.apache.maven.plugin.war.WarMojo com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.ExceptionInInitializerError at org.apache.maven.plugin.war.WarMojo.<init>(Unknown Source) while locating org.apache.maven.plugin.war.WarMojo 1 error at com.google.inject.internal.InternalProvisionException.toProvisionException (InternalProvisionException.java:226) at com.google.inject.internal.InjectorImpl$1.get (InjectorImpl.java:1053) ... Caused by: java.lang.ExceptionInInitializerError at com.thoughtworks.xstream.XStream.setupConverters (XStream.java:679) ... Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Comparator java.util.TreeMap.comparator accessible: module java.base does not "opens java.util" to unnamed module ... Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war (default-war) on project mavenproject1: Execution default-war of goal org.apache.maven.plugins:maven-war-plugin:2.3:war failed: Unable to load the mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.3' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: null ----------------------------------------------------- realm = plugin>org.apache.maven.plugins:maven-war-plugin:2.3 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/C:/Users/selim/.m2/repository/org/apache/maven/plugins/maven-war-plugin/2.3/maven-war-plugin-2.3.jar ... Number of foreign imports: 1 import: Entry[import from realm ClassRealm[maven.api, parent: null]] ----------------------------------------------------- : ExceptionInInitializerError: Unable to make field private final java.util.Comparator java.util.TreeMap.comparator accessible: module java.base does not "opens java.util" to unnamed module @f2276c9 -> [Help 1] To see the full stack trace of the errors, re-run Maven with the -e switch. Re-run Maven using the -X switch to enable full debug logging.
错误原因
maven-war-plugin:2.3依赖的XStream版本过旧,不支持JDK 9及以上的模块系统(JPMS)。JDK 9+的模块系统默认限制了对私有字段的反射访问,导致插件在尝试访问TreeMap.comparator私有字段时被阻止,抛出InaccessibleObjectException。
解决方法
方法1:升级maven-war-plugin到兼容版本(推荐)
在项目的pom.xml中更新maven-war-plugin的版本至3.3.2及以上(该版本已适配JDK 9+的模块系统):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <!-- 使用兼容高版本JDK的稳定版本 --> <version>3.3.2</version> </plugin> </plugins> </build>
更新后重新执行Maven构建命令,问题即可解决。
方法2:临时添加JVM反射权限参数(应急方案)
如果暂时无法升级插件,可通过给Maven添加JVM参数绕过模块系统的反射限制:
- 打开NetBeans,依次进入
工具 > 选项 > Java > Maven - 在
执行标签页的VM选项输入框中添加:--add-opens java.base/java.util=ALL-UNNAMED - 保存配置后重新运行项目。
注意:此方案仅为临时应急,长期来看升级插件是更规范、更安全的解决方式。
内容的提问来源于stack exchange,提问作者SelimSezer
相关产品推荐
相关产品推荐

