使用javax.tool级联内存编译

时间:2012-01-17 00:25:28

标签: java compiler-construction classpath classloader in-memory

Eclipse的JDT编译器提供了一个接口INameEnvironment,它定义了方法findType(...),使您能够进行级联编译。奇怪的是,我想知道是否有任何方法可以使用标准的JDK编译工具包来完成它?

注意,该场景是一个模板引擎,它在内存编译中为模板文件生成的类进行相互依赖,并且它无法预测您遇到模板文件的顺序,因此{{1可能需要先编译它已经编译的父Foo,因此你需要一种机制来进行级联编译,这意味着在编译Bar期间你需要生成另一个源Foo和首先编译它以继续Bar的编译:一些代码如下:

Foo

2 个答案:

答案 0 :(得分:2)

基于我们的评论对话,我认为答案是明确的:不,你不能用JDK编译器做到这一点。它在请求包时给你一个钩子,但不是特定的类依赖。

据我所知,尽可能接近:

带代码的

Here's a nice article虽然需要调整以处理内存类。具体而言,您所描述的问题由JavaFileManager.list(...)方法处理。您必须在此处返回已在内存中缓存的JavaFileObjects。您很可能需要创建文章中描述的ForwardingJavaFileManager的子类 - 尽管已经过修改以处理您正在使用的缓存类。

您可以使用它来编译某些东西。如果它返回错误,请使用正则表达式找出缺少的内容。在生成/编译缺失的代码后,重试编译原始代码。

注意:在某些时候,它确实要求依赖类的FQN作为ForwardingFileManager.list(...)中的packageName参数。我还没有尝试过返回课程。它可能不起作用,因为包不匹配,但也许它会。

答案 1 :(得分:1)

尝试阅读此HelloWorld示例,看看它是否能解决您的问题。如果不发布代码,很难说出您的具体问题。