通过动态编译和加载的代码了解 Eclipse 调试源查找
背景信息:
我有这个java框架,旨在运行外部脚本。为此,我使用类装入器和系统 java 编译器的组合来编译项目构建路径上不存在的“脚本”文件。所有这些都有效,编译器黑魔法和所有。.java
外部加载代码的固有复杂性是调试的难度。我已经通过使用java运行时的远程调试功能解决了这个问题。
因此,我有一个附加到可执行jar的调试配置,该jar具有源查找路径上带有外部java脚本的目录。这实际上工作了一段时间。实际上,它从未正常工作,我只是在我的构建路径上意外地有脚本。令人困惑的是,我可以在脚本中放置断点,调试器实际上在那里停止(一致的行号,日志记录和所有)。不过,了解 eclipse 如何找到源文件会有所帮助。毕竟,Eclipse的大部分文档都是由用户手册组成的。-verbose:class
我怀疑的是,我不小心复制了某些脚本文件,从而将源查找与不同步的源文件混淆了。事实并非如此,我已经删除了重复的文件,eclipse仍然无法找到源。
我尝试了什么
- 双重、三重、四重检查源查找路径,确保它包括每个相关目录
- 启用/禁用的搜索子文件夹
- 启用/禁用的搜索重复项
- 使用目录的绝对路径而不是相对工作区路径
解决方法
这里唯一的解决方法是将脚本文件添加到项目的生成路径上,这对我来说是不可接受的。
我现在在做什么
我正在慢慢地爬行在eclipse开源项目基础存储库中寻找答案。事实证明,Eclipse是一个非常大的项目。
问题
任何人都可以提供 Eclipse 源代码查找工作原理的准确算法表示吗?
知道了这一点,我可能会想出一种方法来强制Eclipse调试器使用反射的正确路径。据我所知,没有任何技术限制阻止动态编译代码进行调试。我知道这一点,因为我的断点正在像我预期的那样挂起我的线程,源代码似乎不想加载:(
相关研究:这似乎可能与如何使用空代码源位置定义类有关,但显然,在将代码动态编译到内存中时,正确的做法是给出空参数...问题仍然存在于如何/为什么这对eclipse的调试器很重要。
4/22 3:30更新:因此,我追求了上面链接的解决方案。现在,我看到我的类正在使用开关从正确的文件路径位置加载,但源查找仍然失败。断点仍然被正确捕获,但迎接我的是熟悉的红色字母。CodeSource
-verbose:class
Source not found
5/6更新 3:15:我追求安德鲁的答案中讨论的解决方案。事实证明,我的.class字节码中的源文件属性与我的源查找路径上存在的文件完全匹配。这让我感到困惑,因为这暗示了文件夹层次结构对源查找有影响。但是,我已经创建了表示“true”包(如.java文件顶部所定义)的“幻像”包层次结构,并将源文件移动到这些文件夹,但是当我将这些路径添加到源查找路径时,源查找仍然失败。关于哪些其他因素在源查找中的作用的任何额外见解都将是巨大的。javap