Как сканировать аннотации в основных источниках, когда RoundEnvironment указывает на тестовые источники

Я создал аннотацию @EnableEntityProcessing, предназначенную для использования в тестах (src/test/java). Также я создал связанный процессор аннотаций EnableEntityProcessingProcessor.

Целью этого EnableEntityProcessingProcessor является сканирование аннотаций @Entity (javax.persistence.Entity), найденных в src/main/java, и создание кода на основе этих аннотаций. Я бы хотел, чтобы код генерировался в тестовом ресурсе, потому что он предназначен для использования только в тестах.

Основная проблема заключается в том, что объект RoundEnvironment указывает на тестовый код, потому что поддерживается аннотация @EnableEntityProcessing (используется только в тестах).

public final class MyProcessor extends EnableEntityProcessingProcessor {
    private static final Class<EnableEntityProcessing> TEST_ANNOTATION_CLASS =
            EnableEntityProcessing.class;
    private static final Class<Entity> PROD_ANNOTATION_CLASS = Entity.class;

    @Override
    public final Set<String> getSupportedAnnotationTypes() {
        return ImmutableSet.of(TEST_ANNOTATION_CLASS.getCanonicalName());
    }

    @Override
    public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        final Set<? extends Element> elementsAnnotated = roundEnv.getElementsAnnotatedWith(TEST_ANNOTATION_CLASS);
        if (!elementsAnnotated.isEmpty()) {
            for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(PROD_ANNOTATION_CLASS)){
                // code generation based on properties from classes annotated with PROD_ANNOTATION_CLASS
            }
        }
    }
}

Из примера кода видно, что я сканирую элементы с аннотацией EnableEntityProcessing, и если один из них существует, то я хочу найти классы с аннотацией Entity. Проблема в том, что roundEnv их не находит, потому что он связан с тестовыми исходниками.


person Alex    schedule 12.10.2016    source источник
comment
Вы можете немного расширить свой вопрос? может быть, какой-то код, что это за RoundEnvironment и почему он указывает на класс, который является тестовым кодом?   -  person tonakai    schedule 12.10.2016
comment
Я добавил пример кода   -  person Alex    schedule 12.10.2016
comment
Ясно, ну, я думаю, поскольку вы ссылаетесь на @TestAnnotation в своем основном коде, он должен быть создан там, а не в тестовой папке. даже если вы аннотируете тестовые классы/методы или используете другую аннотацию в сгенерированном коде, поскольку вы его генерируете.   -  person tonakai    schedule 12.10.2016
comment
Тестовая аннотация (EnableEntityProcessing) предназначена для включения обработки элементов с аннотацией javax.persistence.Entity из производственного кода. Я не хочу иметь его в основной/производственной версии, потому что он предназначен только для тестов. Я обновил свой пост.   -  person Alex    schedule 13.10.2016


Ответы (1)


Вы можете реализовать свой процессор так, чтобы он запускался @Entity, применить его к основному коду вашей единицы компиляции, но затем использовать что-то вроде target/generated-test-sources в качестве каталога для исходников, сгенерированных процессором.

person Gunnar    schedule 03.11.2016