JVMVRFY013:升级至Java 1.8后服务器启动出现运行时错误
这个VerifyError(JVMVRFY013类加载约束违反)问题我之前碰到过,核心原因是旧版本的wstx-asl.jar和Java 8的类加载机制、XML API实现不兼容,导致com.ctc.wstx.sr.BasicStreamReader的getNamespaceContext()方法和JDK自带的javax.xml.namespace.NamespaceContext类出现了加载约束冲突。下面是几个靠谱的解决办法:
升级到兼容Java 8的Woodstox版本
wstx-asl是比较旧的Woodstox开源分支,早就停止维护了,对Java 8的适配很差。建议直接替换成官方维护的Woodstox核心库,它完全兼容Java 8及以上版本。如果用Maven的话,替换依赖为:<dependency> <groupId>com.fasterxml.woodstox</groupId> <artifactId>woodstox-core</artifactId> <version>6.5.1</version> <!-- 可以用最新的稳定版 --> </dependency>替换后,旧的wstx-asl.jar就可以从项目里移除了,新版本的Woodstox能完美处理XML解析,不会再触发类加载约束问题。
调整WebSphere类加载策略
如果暂时没法升级依赖,那可以修改WebSphere的应用类加载顺序,让应用自己的jar包优先被加载。在WebSphere控制台找到你的应用,进入“类加载和更新检测”配置,把类加载策略改成PARENT_LAST(父类加载器最后)。这样WebSphere不会先加载容器自带的XML相关类,而是先加载你应用里的wstx-asl.jar,避免冲突。清理重复或冲突的XML依赖
检查项目里有没有重复引入的XML解析库,比如同时存在wstx-asl和其他Woodstox版本,或者和xerces、xalan这类库共存。用Maven的mvn dependency:tree命令生成依赖树,找出重复的依赖,在pom.xml里用<exclusions>标签排除掉多余的版本,确保只有一套XML解析库在生效。
调整完之后,重新打包部署应用,启动服务器应该就能解决这个运行时错误了。
内容的提问来源于stack exchange,提问作者Chandan D N

