You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:06:12