iSeries V7R2M0环境下STRDBG调试Java程序源码不可用求助
在iSeries V7R2M0上调试RPGILE调用的Java程序
首先明确:V7R2M0环境下完全可以调试从RPGILE调用的Java源码,你遇到的问题主要是调试配置细节没到位,加上CRTJVAPGM命令在V7R2已被正式移除(没错,这个命令仅存在于V7R1及更早版本),下面是针对性的解决步骤:
1. 确保Java类编译时包含调试信息
这是最容易忽略的核心前提:你的.class文件必须用javac -g命令编译,这样才会嵌入调试符号(行号、变量映射信息等)。如果jar里的class文件不带调试信息,哪怕有源码,调试器也无法关联源码内容。
- 重新编译Java代码:
javac -g -d ./classes com/yourpackage/YourClass.java - 重新打包jar:确保新生成的class文件和对应的
.java文件保持同一包结构(比如jar内同时存在com/yourpackage/YourClass.class和com/yourpackage/YourClass.java)
2. 正确启动STRDBG并启用Java调试支持
启动STRDBG时必须明确指定Java源码调试选项,否则默认不会加载Java调试组件:
STRDBG PGM(YOURLIB/YOUR_RPG_PGM) OPTION(*JAVASRC)
同时检查当前作业的Java调试属性是否开启:
CHGJOB JOB(*CURRENT) JAVA(*DEBUG)
这个设置会让作业加载Java调试所需的底层组件,确保STRDBG能识别并关联Java模块。
3. 修正源码与类路径的配置
你之前把jar放到JDK的lib目录是没必要的,反而可能引发类加载优先级冲突,建议调整为:
- 将包含调试class和源码的jar放在应用专属目录(比如
/QSYS.LIB/YOURLIB.LIB/YOURJAR.FILE或/QOpenSys/yourapp/lib) - 确保作业的
CLASSPATH环境变量正确指向该jar:ADDENVVAR ENVVAR(CLASSPATH) VALUE('/QOpenSys/yourapp/lib/your.jar' *ADD) - 额外设置
java.source.path系统属性,让调试器明确找到源码位置(哪怕jar内已包含源码,这个设置能避免路径识别偏差):
这里的路径可以是源码目录,也可以是包含源码的jar文件。ADDENVVAR ENVVAR(JAVA_TOOL_OPTIONS) VALUE("-Djava.source.path=/QOpenSys/yourapp/lib/your.jar:/QOpenSys/yourapp/src")
4. 确认Java版本匹配
你的系统同时存在JDK70和71,要确保运行RPG调用的Java程序使用的版本与调试环境一致:
- 用
DSPJOB查看当前作业的JAVA_VERSION环境变量,确认是1.7.0的对应版本 - 如果版本不匹配,调整作业的Java版本:
CHGJOB JOB(*CURRENT) JAVA_VERSION('7')
5. 备用调试方案:使用Java自带的jdb远程调试
如果STRDBG的Java调试仍有问题,可以结合远程调试工具:
- 在RPG程序调用Java的代码前,添加远程调试启动参数:
比如调用JAVA命令时追加:JAVA CLASS(com.yourpackage.YourClass) OPTIONS('-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000') - 打开QSH会话,启动jdb连接到远程调试端口:
这样你可以直接在jdb里单步调试Java代码,同时RPG程序会暂停直到jdb连接成功,也能配合STRDBG调试RPG部分逻辑。jdb -attach localhost:8000
内容的提问来源于stack exchange,提问作者Piro
相关产品推荐
相关产品推荐

