Glassfish 4.0部署WAR包遇ClassFormatError问题求助
问题分析
你碰到的java.lang.ClassFormatError: Field "XMLString" ... has illegal signature "V"错误,核心原因是字段被错误标记为void类型(字节码中"V"代表void)——但Java字段根本不允许是void类型,这说明字节码生成或类加载过程出了问题。结合你的场景(JDK1.7+Glassfish2.5正常,升级到JDK1.8+Glassfish4.0失败),大概率是以下几个原因:
- JDK8的字节码规范和JDK7存在细微差异,旧版本的XML处理类库(比如Xerces、JAXB)在JDK8环境下编译/运行时,生成了不符合规范的字节码
- Glassfish4.0自带的JavaEE类库和你的WAR包中打包的旧版本库发生冲突,导致类加载时字节码解析出错
- 编译配置存在问题:虽然用了JDK8,但编译目标版本还是1.7,或者启用了JDK8预览特性,导致字节码不兼容Glassfish4.0
解决方案
我整理了按优先级排序的排查和解决步骤,你可以逐一尝试:
1. 升级XML相关依赖库
错误提到的XMLString字段大概率和XML处理类库有关,这类库的旧版本大多不兼容JDK8:
- 将WAR包中的
xercesImpl.jar升级到2.12.0及以上版本 - 将JAXB相关库(
jaxb-api.jar、jaxb-impl.jar等)升级到2.3.x版本(完全兼容JDK8) - 移除老旧的
xml-apis.jar——JDK8已经内置了大部分XML API,无需单独打包
2. 排查Glassfish4.0的库冲突
Glassfish4.0自带完整的JavaEE 7类库,如果WAR包打包了和服务器自带版本冲突的库,会触发类加载异常:
- 检查项目依赖配置(比如Maven/Gradle),将JavaEE相关依赖(JAX-RS、JAXB、JPA等)的scope设置为
provided,告诉构建工具这些库由Glassfish提供,无需打包进WAR - 手动检查WAR包的
WEB-INF/lib目录,删除Glassfish已自带的库(比如javax.servlet.jar、jaxb-api.jar等)
3. 修正编译配置
确保Netbeans的编译参数完全适配JDK8:
- 右键项目 → 属性 → 编译 → 将“源版本”和“目标版本”都设置为1.8
- 取消勾选“启用预览功能”(如果有),避免生成非标准字节码
- 清理编译缓存:删除项目根目录下的
target文件夹,重新执行“清理并构建”
4. 清理Glassfish的临时文件
Glassfish会缓存已部署应用的类文件,旧缓存可能导致异常:
- 停止Glassfish服务器
- 删除
glassfish4/glassfish/domains/domain1/generated和glassfish4/glassfish/domains/domain1/applications目录下的所有内容 - 重启Glassfish后重新部署WAR包
5. 检查字节码增强工具
如果项目使用了AspectJ、JBoss BCEL这类字节码增强工具,旧版本可能不支持JDK8字节码规范:
- 升级工具到支持JDK8的版本(比如AspectJ 1.8.x及以上)
- 暂时禁用字节码增强,重新编译部署,验证是否是工具导致的问题
内容的提问来源于stack exchange,提问作者Sudhakar Chavali
相关产品推荐
相关产品推荐

