Java8环境下WildFly11部署Spring4+Tiles3.0.7 EAR包遇解析异常
UnsupportedOperationException异常 先还原下你的问题场景:你在WildFly 11上部署一个基于Java 8、包含Spring 4和Tiles 3.0.7的EAR包时,遇到了这个异常:
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
你提供的服务器启动关键日志如下:
00:45:18,865 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: HTTP管理接口监听于http://127.0.0.1:9990/management
00:45:18,865 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: 管理控制台监听于http://127.0.0.1:9990
00:45:18,865 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 11.0.0.Final(WildFly Core 3.0.8.Final)已启动,耗时15761毫秒...
这个异常本质是Tiles自带的JSP解析组件和WildFly内置的Jasper容器版本不兼容导致的——WildFly 11自带的是Tomcat Jasper 9.0.x,而Tiles 3.0.7依赖的旧版解析器和它冲突,才会抛出“不支持null版本规范”的错误。下面给你几个落地的解决步骤:
1. 排除Tiles依赖中的冲突包
首先在你的构建文件(Maven/Gradle)里,把Tiles自带的JSP相关依赖排除掉,因为WildFly已经提供了这些类,不需要应用自己打包进去。
如果用Maven,修改tiles-jsp的依赖配置:
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>3.0.7</version> <exclusions> <!-- 排除冲突的JSP API --> <exclusion> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> </exclusion> <!-- 排除Tiles自带的Tomcat Jasper --> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> </exclusion> </exclusions> </dependency>
2. 配置WildFly部署描述符(可选,排除依赖后仍有问题时用)
如果排除依赖后还是报错,可以在你的EAR包中添加jboss-deployment-structure.xml文件,放在META-INF目录下,强制WildFly使用容器提供的JSP模块,避免加载应用中的冲突类:
<jboss-deployment-structure> <deployment> <!-- 排除应用中可能存在的冲突模块 --> <exclusions> <module name="javax.servlet.jsp.api" /> </exclusions> <!-- 显式依赖容器的JSP模块 --> <dependencies> <module name="javax.servlet.jsp.api" export="true" /> </dependencies> </deployment> </jboss-deployment-structure>
3. 检查Spring的Tiles视图配置
确保Spring的Tiles视图解析器没有指定自定义的JSP解析器,让它默认使用容器提供的组件。比如你的Spring XML配置应该是这样的:
<!-- Tiles视图解析器 --> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/> </bean> <!-- Tiles配置器 --> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/tiles.xml</value> </list> </property> </bean>
最后验证步骤
- 重新构建你的EAR包,确保所有冲突依赖都已排除
- 清理WildFly的缓存:删除
standalone/data和standalone/tmp目录下的所有内容 - 重新启动WildFly并部署EAR包,观察日志是否还有异常
内容的提问来源于stack exchange,提问作者Mickey

