WildFly 10部署app.war失败:依赖缺失与数组越界问题排查
问题分析与解决办法
可能的失败原因
- 类加载冲突未彻底解决:虽然排除了WildFly的jaxrs子系统,但Jersey 1.8依赖的
javax.ws.rs相关API、JSON处理类等组件,可能仍被WildFly系统类加载器优先加载,导致版本不匹配,触发数组越界异常。 - Genson与Jersey/WildFly兼容性问题:Genson 1.4在Java 8环境下,和Jersey 1.8的集成逻辑可能存在初始化问题,或与WildFly自带的Jackson等JSON解析库发生隐式冲突。
- Log4j 1.2与WildFly日志子系统冲突:WildFly 10默认使用JBoss Logging,Log4j 1.8的存在可能干扰类加载流程,间接引发依赖缺失或初始化异常。
- Jersey 1.8在Java 8下的隐性兼容问题:Jersey 1.8发布于2012年,早于Java 8,部分内部逻辑在Java 8的类库(如反射API、
java.util组件)下可能触发数组越界这类底层异常。
解决办法
1. 彻底隔离WildFly冲突子系统
修改jboss-deployment-structure.xml,不仅排除jaxrs,还要屏蔽日志、JSON相关的冲突子系统与模块,确保应用类加载优先级:
<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jaxrs"/> <subsystem name="logging"/> <subsystem name="jackson"/> </exclude-subsystems> <exclusions> <module name="com.fasterxml.jackson.core.jackson-databind"/> <module name="org.apache.log4j"/> <module name="javax.ws.rs.api"/> </exclusions> <local-last value="true"/> <!-- 让应用自身类加载器优先加载依赖 --> </deployment> </jboss-deployment-structure>
2. 调整Maven依赖配置,消除冲突
在pom.xml中显式引入Jersey所有核心模块,排除Genson传递的冲突API,确保依赖版本统一:
<dependencies> <!-- Jersey核心依赖,显式声明避免隐式依赖缺失 --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.8</version> </dependency> <!-- Genson依赖,排除冲突的传递API --> <dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>1.4</version> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> </exclusion> </exclusions> </dependency> <!-- Log4j依赖,确保编译打包进WAR --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>compile</scope> </dependency> </dependencies>
3. 修复Jersey 1.8在Java 8下的反射兼容问题
Jersey 1.8的部分类在Java 8反射机制下会触发数组越界,添加JVM启动参数规避:
-Dsun.reflect.noValidityChecks=true
4. 验证依赖完整性
使用Maven命令检查依赖树,确认无缺失或冲突的依赖:
mvn dependency:tree -Dverbose
重点核对javax.ws.rs、JSON相关依赖的版本是否统一为Jersey 1.8对应版本,排除WildFly来源的传递依赖。
5. 优化Web.xml的Jersey配置
确保Jersey Servlet完全使用应用自身组件,不依赖容器提供的服务:
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>你的业务代码包路径</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
内容的提问来源于stack exchange,提问作者user3637971
相关产品推荐
相关产品推荐

