Обработка аннотаций никогда не вызывается

Я работаю над небольшой библиотекой, которая должна генерировать Java-код из аннотаций.

public class MyAnnotationProcessor extends AbstractProcessor {

/**
 * This suffix will be appended on every {@link OrmAble}
 */
public static final String CLASS_SUFFIX = "Helper";

private Elements elementUtils;
private Types typeUtils;
private Filer filer;

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

    elementUtils = env.getElementUtils();
    typeUtils = env.getTypeUtils();
    filer = env.getFiler();
}

@Override
public boolean process(Set<? extends TypeElement> annotations,
        RoundEnvironment roundEnv) {

    System.out.println("Start AnnotationProcessing");

    for (Element elem : roundEnv
            .getElementsAnnotatedWith(MyAnnotation.class)) {

        if (elem instanceof TypeElement)
            createCode((TypeElement) elem);

    }

    // no further processing of this annotation type
        return true;
    }

private void createCode(TypeElement typeElement) {

        // Write the view injector class.
        try {

            JavaFileObject jfo = filer.createSourceFile(
                    getPackageName(typeElement) + typeElement.getSimpleName()
                            + CLASS_SUFFIX, typeElement);

            Writer writer = jfo.openWriter();
            brewJavaCode(writer, typeElement);
            writer.flush();
            writer.close();

        } catch (IOException e) {
            error(typeElement, "Unable to write injector for type %s: %s",
                    typeElement, e.getMessage());
        } catch (ClassNotFoundException e) {
            error(typeElement, "Class "
                    + typeElement.getQualifiedName().toString() + " not found");
        }
    }
}

Я использую maven для его создания, но аннотацию и написал некоторый модульный тест, в котором есть несколько классов, аннотированных с помощью MyAnnotation.

Мой файл pom.xml выглядит так:

<plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>

                 <executions>
                      <execution>
                        <id>default-compile</id>
                        <goals><goal>compile</goal></goals>
                        <configuration>
                          <compilerArgument>-proc:none</compilerArgument>
                        </configuration>
                      </execution>
                      <execution>
                        <id>default-test-compile</id>
                        <goals><goal>testCompile</goal></goals>
                        <configuration>
                          <annotationProcessors>
                            <annotationProcessor>com.example.MyAnnotationProcessor</annotationProcessor>
                          </annotationProcessors>
                        </configuration>
                      </execution>
                 </executions>
            </plugin>

Я также пытался запустить тесты с аннотированными классами в eclipse. Я создал банку из своей библиотеки и установил ее как AnnotationProcessor в eclipse. Но обработка аннотации никогда не выполняется.

Насколько я знаю, сгенерированные файлы классов должны быть помещены в target/right или где будет храниться сгенерированный файл Java?

JavaFileObject jfo = filer.createSourceFile(
                    getPackageName(typeElement) + typeElement.getSimpleName()
                            + CLASS_SUFFIX, typeElement);

Любое предложение, что может быть не так?


person sockeqwe    schedule 18.11.2013    source источник
comment
Ваш процессор аннотаций аннотирован @SupportedAnnotationTypes и @SupportedSourceVersion?   -  person jbunting    schedule 19.11.2013
comment
Да: @SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedAnnotationTypes(com.example.MyAnnotation)   -  person sockeqwe    schedule 19.11.2013


Ответы (2)


Я знаю, что это старая тема, но для будущих читателей убедитесь, что у вас настроены следующие элементы:

  1. javax.annotation.processing.Processor, который содержит полное имя точки доступа, регистрируется под META-INF/services.
  2. Вы переопределяете функцию getSupportedAnnotationTypes(), которая должна возвращать список желаемых Annotations для обработки.
  3. По крайней мере один класс в вашем classPath использует одну из нужных аннотаций. Это связано с Java compiler оптимизацией таким образом, что обработчики аннотаций вызываются только в том случае, если И ТОЛЬКО ЕСЛИ они должны быть вызваны, поэтому класс аннотируется одной из желаемых аннотаций.

Удачного кодирования!

person AouledIssa    schedule 28.05.2020

Вы должны определить все свои процессоры в текстовом файле, имя которого начинается с javax.annotation.processing.Processor.

Если вы хотите увидеть рабочий пример, посмотрите здесь. https://github.com/jsaurav/Code-Generation

person saurav    schedule 18.11.2013
comment
да, я нашел некоторое описание: Включите в файл Jar каталог META-INF/services. Включите в каталог файл с именем javax.annotation.processing.Processor. Однако это все равно не работает. Сгенерированный JAR-файл содержит файл META-INF/service/javax.annotation.processing.Processor. Даже если я компилирую тестовый класс, аннотированный с помощью javac, мой процессор аннотаций не запускается. - person sockeqwe; 19.11.2013
comment
Ru уверены, что у вас есть какой-либо класс, аннотированный MyAnnotation? - person saurav; 19.11.2013