idea在jdk源码中写入注释导致的source code does not match the bytecode

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就不会有问题了
在这里插入图片描述

脚本报错解决
  1. 如果发现报错但执行脚本的窗口很快关闭了,把最后一行的#去掉

  2. 执行过程中可能会出现"Permission denied"的报错​

    在这里插入图片描述

    需要对刚刚创建的endorsed文件夹修改权限,右键文件夹找到属性,在"安全"里找到编辑,然后找到组或用户名中的Users,修改Users权限为完全控制,应用,问题解决
    在这里插入图片描述

参考:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值