解决Idea查看源代码警告Library source does not match the bytecode for class XXX问题
作者:笔墨桑
背景
执行代码的时候抛出异常,想在第三方jar文件中打断点分析问题原因,进入该文件后IDEA给出警告
翻译过来就是资源库的源代码与类的字节码不匹配,当前我们在UpgraderManager.java
中,右侧有一个Open.class file按钮,点击之后就会跳转到UpgradeManager.class
中,点击show diff或者对比这两个文件可以看到是不一样的。
这个问题影响还是挺大的,具体的现象就是程序真正运行的代码行数,与我们看到的代码行数不一致,也就没法打断点分析程序的走向
分析
我们在使用第三方jar时,用的是编译好的字节码文件,即.class文件,而不是源文件.java。
而.class文件我们是看不懂的,如果我们想在IDE中看第三方源代码,可以通过IDE的插件进行自动反编译,但是一般来说不会有注释,而且参数名也不是原来的参数名,会被反编译成var1, var2, var3等。
当然也可以自己下载源文件后进行配置。
一般来说第三方jar在打包时也会将源文件和class文件一起发布,所以引用这个jar时IDE会自动引用它的源文件,可以通过如下方式进行查看
以IDEA为例,点击File
->Project Structure..
在弹出的窗口中选择Library
菜单,中间的窗口部分选中包含警告文件的jar,在右侧可以看到Classes
字节码,Sources
源代码以及JavaDocs
java文档对应的jar
到这里可以分析出,警告的内容就是说xxx.jar中内容与xxx-source.jar中的内容不一致,进入到该文件夹中继续进行查看
虽然jar与source.jar的版本一致,但是修改的日期不一样,也就是说由于某种原因导致了jar与source.jar里边的内容不一致了,使用解压软件进行查看里边的某些文件也会发现,有些代码在source.jar中存在但是在jar中却不存在
解决办法
知道了问题原因,那么就知道怎么解决了。
很简单,将该版本中的所有jar全部删除,重新用maven下载
本例中就需要将xxx.2.1.0这个文件夹全部删除,然后在IDEA中使用maven reload project(旧版本为maven reimport)重新下载该jar,或者自行去maven仓库网站下载亦可。下载之后再查看该文件,就没有警告了,断点就可以继续打了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。