idea在jdk源码中写入注释导致的source code does not match the bytecode
问题说明
搭建idea的jdk源码阅读环境后(见搭建jdk环境),在源码中写入注释导致代码行数量变化后,debug时发现无法debug到正确的行数,并显示"source code does not match the bytecode"
问题原因
我们知道,源文件(.java后缀)是给程序员看的,jvm真正执行的是源文件编译后生成的字节码文件(.class后缀)。在搭建环境时,我们修改的只是jdk对应的源文件位置,该位置编译生成的class文件在项目的out文件夹里,不会直接修改原jdk字节码,而idea运行jdk相关类时看的还是原jdk字节码,所以会出现修改源码运行后却不是修改的功能的情况、添加多行注释出现"source code dose not match the bytecode(源文件和字节码不匹配)",debug不到对应行数的情况
问题解决
参考解决debug行号对不上文章,通过将项目文件out里编译出的class文件打包放到jdk的endorsed文件下解决
先看一下我的项目结构,我的src下的有两个包,source是用于存放源码的,test存放我们的测试类,而idea编译存放的out目标文件夹中,只需要打包和jdk相关的source(就是上面的源码包名,取决于你取了什么名字)、com、java、javax、org、sun放到endorsed文件夹里,如果全打包了就会出现修改了测试类还需要编译放进endorsed里的问题
首先,我们需要给idea下载插件BashSupport并进行配置(具体百度),用于运行shell脚本
接着,找到自己jdk的文件夹,进入到它的jre/lib内创建endorsed文件夹,为什么必须是endorsed见此
然后,在项目中新建shell脚本,内容如下,具体目录请根据自己情况修改:
#!/bin/bash
#进入项目的out/production的项目名目录
cd d:/MainWork/Idea-workspace/TestJava/out/production/TestJava
#压缩成jar
jar cf0 my_source.jar source com java javax org sun
#将jar移动到jdk目录的/jre/lib/endoresd
mv my_source.jar 'c:/Program Files/Java/jdk1.8.0_131/jre/lib/endorsed'
#read -p "按下任意键退出"
最后,每次修改源码后,对项目进行rerun build,然后执行shell脚本
之后进行debug就不会有问题了
脚本报错解决
-
如果发现报错但执行脚本的窗口很快关闭了,把最后一行的#去掉
-
执行过程中可能会出现"Permission denied"的报错
需要对刚刚创建的endorsed文件夹修改权限,右键文件夹找到属性,在"安全"里找到编辑,然后找到组或用户名中的Users,修改Users权限为完全控制,应用,问题解决