Eclipse集成WebSphere 9.0调试EAR包时代码不同步如何解决
WebSphere 9.0 + Eclipse 调试时代码行号不同步排查方案
1. 先排除编译配置错误
这类问题首先排除编译环节没生成行号信息的问题,不用先急着清缓存:
- 打开Eclipse全局编译配置
Window > Preferences > Java > Compiler,确认Classfile Generation分类下的Add line number attributes to generated class files为勾选状态,未勾选时编译出的class文件本身就没有正确的行号映射,怎么部署都会错位。 - 右键关联的EJB、Web项目,进入
Build Path > Configure Build Path > Source标签页,检查每个源码目录的Excluded规则,确认你调试涉及的Java文件没有被排除在编译范围外,被排除的文件会一直复用旧版本class。 - 关闭
Project > Build Automatically,执行Project > Clean,勾选所有关联项目和Start a build immediately,等全量编译完成后再重新开启自动构建,排除增量编译导致的class和源码不匹配。
2. 全量清理WAS 9.0侧缓存
WAS的多层缓存不会因为控制台点重新部署就自动清空,清理前必须完全停止对应的WAS server,避免文件被进程占用删不干净:
- 进入WAS安装目录下的profile路径(默认是
profiles/AppSrv01,如果自定义过profile选自己实际用的那个),删除以下路径下的所有内容:wstemp:WAS运行时工作临时缓存temp:JSP、Web/EJB模块编译后的临时class缓存config/temp:配置、应用同步的临时缓存
- 进入
installedApps/<对应cell名称>/路径,删除当前调试的EAR对应的整个展开目录,不要留旧的应用文件。 - 重启WAS,先不关联Eclipse,直接登录WAS控制台上传本地刚编译好的EAR包安装,安装时勾选
Precompile JavaServer Pages files和Distribute application选项,安装完成后启动应用,先验证功能是最新代码逻辑,确认WAS本身能正常部署新包。
3. 清理Eclipse WDT插件的联动缓存
如果是通过Eclipse的WebSphere Developer Tools插件直接关联WAS做热部署,插件本身有独立的部署缓存,点重新发布不会自动清空:
- 完全关闭Eclipse,进入当前使用的Eclipse工作空间目录,删除以下路径下的所有缓存文件:
.metadata/.plugins/com.ibm.ws.ast.st.core/core.metadata/.plugins/com.ibm.ws.management.core/cache
- 重新打开Eclipse,删除原有配置的WAS服务器实例,重新创建关联对应profile的WAS 9.0服务器,重新将EAR包添加到服务器关联列表,不要复用之前的部署配置。
- 调试启动前先右键服务器选择
Publish,等控制台提示发布完成后,再以Debug模式启动服务器,不要直接点Debug按钮触发增量发布。
4. 特殊场景排查
以上步骤做完仍有问题的话,排查两个容易遗漏的点:
- 对齐JDK版本:WAS 9默认运行环境是Java 8,检查Eclipse项目的编译合规级别,确保和WAS配置的JVM版本完全一致。版本不匹配时WAS会对class做字节码转换,直接打乱行号映射。WAS侧JDK版本可以在控制台
Application servers > <目标服务器> > Java and Process Management > Process definition > Java Virtual Machine路径查看。 - 排查类冲突:如果EAR包内多个模块(比如多个WAR、WAR和EJB JAR)存在同包同名的类,类加载器会优先加载路径优先级更高的旧版本类,导致调试关联的源码和实际执行的class不匹配。可以在控制台开启类加载追踪:进入
Application servers > <目标服务器> > Troubleshooting > Logs and trace > Diagnostic trace service,添加追踪规则com.ibm.ws.classloader.*=all,重启后查看trace日志里实际加载的class文件路径,定位到旧class文件删除即可。
注意:所有缓存清理操作必须在WAS完全停止、Eclipse完全关闭的状态下执行,否则进程占用会导致旧文件残留。清理完成后第一次部署不要做任何代码修改,等全量部署启动完成后再修改代码调试,避免增量同步逻辑触发旧缓存复用。
内容的提问来源于stack exchange,提问作者Luciana Oliveira
相关产品推荐
相关产品推荐

