我希望在机器上不存在依赖项的情况下编译源代码。
示例:文件 A.java:
import some.pkg.B;
public class A extends B {...}
我没有 B 源,我希望挂钩 JavaFileManager 或自定义 ClassLoader 以获取有问题的符号(包 'some.package' 和 B 类),然后使用我拥有的服务来检索源细绳。
编译代码:(inputFiles有A.java)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();
JavaFileManager (getFileForInput..) 和我的类加载器 (findClass, loadClass ..) 上的钩子在编译时没有触发,我收到错误消息:
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
编辑
在使用 API、查看 JavaCompiler(旧版本)源代码并阅读编译概述之后,我仍然找不到可以用来从语法树中提供符号的 API 挂钩。似乎 API 需要根据 kschneid 建议的包名称获取所有资源。
我想到的一种解决方法是运行 JavaCompiler 并分析缺少符号的错误消息。这样我就会知道需要哪些符号,获取它们并重新编译。
还有其他解决方法/解决方案吗?