渐进式编译中AST的自定义Java注释处理器

时间:2018-02-01 16:03:27

标签: java netbeans javac abstract-syntax-tree processor

我有这种情况:两个maven模块(jdk6)A和B.

在模块A中,我定义了这些类:

MyBeanAnnotation:这样定义的类的注释:

package x.y.z;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface MyBeanAnnotation {    
    String name();
}

MyAnnProcessor:一个扩展AbstractProcessor的类,定义如下:

package x.y.z;
import java.io.File;
import java.util.Date;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;

@SupportedAnnotationTypes("x.y.z.MyBeanAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class MyAnnProcessor extends AbstractProcessor{

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
    super.init(processingEnv);
}    

@Override
     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Hello World!");
}
    return true;
}
}
  • 我在META-INF / services中创建了一个名为javax.annotation.processing.Processor的文本文件

    x.y.z.MyAnnProcessor

我可以编译它,没问题。

在模块B中:

  • pom.xml:创建了对模块A的依赖

我创建了一个用MyBeanAnnotation注释的MyAnnotatedBean类

package x.y.z;
import x.y.z.MyBeanAnnotation;

@MyBeanAnnotation(name = "scemochileggee")
public class MyAnnotatedBean {
    private String qweq = "qweq";
}

当我从头编译B(例如mvn clean install)时,处理器MyAnnProcessror被正确调用,我可以在编译器日志中看到打印输出

另一方面,当我在Netbeans中编辑它(我只尝试过这个IDE)并保存MyAnnotatedBean文件时,没有任何反应并且未调用MyAnnProcessor。

您是否知道是否有办法让MyProcessor在增量编译中工作?

提前致谢。

0 个答案:

没有答案