Eclipse的JDT编译器提供了一个接口INameEnvironment
,它定义了方法findType(...)
,使您能够进行级联编译。奇怪的是,我想知道是否有任何方法可以使用标准的JDK编译工具包来完成它?
注意,该场景是一个模板引擎,它在内存编译中为模板文件生成的类进行相互依赖,并且它无法预测您遇到模板文件的顺序,因此{{1可能需要先编译它已经编译的父Foo
,因此你需要一种机制来进行级联编译,这意味着在编译Bar
期间你需要生成另一个源Foo
和首先编译它以继续Bar
的编译:一些代码如下:
Foo
答案 0 :(得分:2)
基于我们的评论对话,我认为答案是明确的:不,你不能用JDK编译器做到这一点。它在请求包时给你一个钩子,但不是特定的类依赖。
据我所知,尽可能接近:
带代码的 Here's a nice article虽然需要调整以处理内存类。具体而言,您所描述的问题由JavaFileManager.list(...)
方法处理。您必须在此处返回已在内存中缓存的JavaFileObjects。您很可能需要创建文章中描述的ForwardingJavaFileManager
的子类 - 尽管已经过修改以处理您正在使用的缓存类。
您可以使用它来编译某些东西。如果它返回错误,请使用正则表达式找出缺少的内容。在生成/编译缺失的代码后,重试编译原始代码。
注意:在某些时候,它确实要求依赖类的FQN作为ForwardingFileManager.list(...)中的packageName参数。我还没有尝试过返回课程。它可能不起作用,因为包不匹配,但也许它会。
答案 1 :(得分:1)
尝试阅读此HelloWorld示例,看看它是否能解决您的问题。如果不发布代码,很难说出您的具体问题。