从Java8升级到Java17为何需显式引入maven-war-plugin?
报错根本原因
maven-war-plugin不需要你手动声明就会参与构建:只要项目pom中<packaging>配置为war,Maven就会按照内置的构建生命周期规则,隐式引入对应版本的maven-war-plugin完成war包的打包、目录结构处理等工作。你之前没手动加插件也能正常构建,是因为当时所用Maven版本自带的默认war插件版本完全适配Java 8环境。- 升级Java 17后触发报错的核心是版本兼容性问题:Maven隐式引入的旧版
maven-war-plugin(普遍为3.2.x及更早版本)无法在Java 17环境正常运行。旧版插件依赖的低版本XStream序列化组件,用到了Java 17通过JEP 403强封装的JDK内部API,类加载阶段就会因为权限不足抛出静态初始化失败错误,也就是你看到的Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer报错。 - 手动添加插件可以修复问题的逻辑非常直接:你在pom中手动声明3.3.2及以上版本的
maven-war-plugin后,会直接覆盖Maven默认绑定的低版本插件。高版本插件已经升级了内置的序列化依赖,移除了对Java 17封禁的内部API的调用,自然可以正常完成构建流程。
补充:如果你的项目继承了Spring Boot这类第三方父POM,父POM也会统一管控内置构建插件的版本。如果父POM本身没有升级到适配Java 17的版本,同样会传递引入低版本不兼容的war插件,触发同类报错。
内容的提问来源于stack exchange,提问作者ConfusedUbuntist
相关产品推荐
相关产品推荐

