Интеграция процессора аннотаций в один проект

#java #spring #maven

#java #весна #maven

Вопрос:

Можно ли использовать процессор аннотаций в том же проекте, где он определен?

Пример:

  • Src/
    • MyAnnotation.java
    • path_to_MyAnnotationProcessor.MyAnnotationProcessor.java
    • другие классы
  • Ресурсы
    • META-INF/services/javax.annotation.обработка.Процессор
  • pom

когда я буду работать mvn clean install , я буду ожидать, что мой процессор будет обрабатывать классы, аннотированные с помощью MyAnnotation .

Я не хочу импортировать уже скомпилированный процессор из другой библиотеки, я просто хочу использовать его, как только я определил его в своем src.

На данный момент я получаю сообщение об ошибке: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project my-project: Compilation failure
[ERROR] Annotation processor 'path_to_MyAnnotationProcessor' not found

часть pom.xml , где я исх. для моих процессоров:

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.plugin.compiler}</version>
            <configuration>
                <source>${version.java}</source>
                <target>${version.java}</target>
                    <annotationProcessors>
                       <proc>path_to_MyAnnotationProcessor.MyAnnotationProcessor</proc>
                    </annotationProcessors>
            </configuration>
        </plugin>
 

Спасибо всем, особенно @Stefan Ferstl и @yegodm. Решение, полученное от yegodm, является:
«Один из способов — это два модуля в одном проекте. Один модуль будет определять аннотации и процессор. У другого это было бы как зависимость для установления порядка сборки «.

Комментарии:

1. Вы пробовали это? 🙂

2. Вы пробовали это, заменив метасинтаксический «path_to_MyAnnotationProcessor» фактическим путем к вашему процессору аннотаций в вашем файле .pom? (опубликуйте свой POM, если это так)

3. Один из способов — иметь два модуля в одном проекте. Один модуль будет определять аннотации и процессор. Другой имел бы это как зависимость для установления порядка сборки.

4. если это единственное решение, то я поступлю так, спасибо!

5. @BadZen Рассматривает это как быстрое решение проблемы. Вот почему я не делаю это ответом. Для меня это сработало довольно безболезненно.

Ответ №1:

Самый простой способ решить эту проблему — преобразовать ваш проект в многомодульный проект, где процессор аннотаций находится в собственном модуле. Имея другой модуль для процессора аннотаций, вы можете использовать совершенно новую <annotationProcessorPaths> опцию для определения процессора аннотаций через groupId / artifactId .

Модулю, использующему процессор аннотаций, может потребоваться зависимость от модуля процессора аннотаций, чтобы он был создан первым.

Примечание: В предыдущей версии этого ответа я описал дополнительный способ решения этой проблемы, который, по-видимому, не сработал из коробки. Эта часть была удалена.

Комментарии:

1. Я попробовал этот подход, но та же ошибка — [ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins:maven-compiler-plugin:3.6.1:компиляция (по умолчанию-компиляция) для проекта my_project_name: сбой компиляции [ОШИБКА] Обработчик аннотаций ‘path_to_MyAnnotationProcessor. MyAnnotationProcessor’ не найден

2. НО решение состоит в том, чтобы создать многомодульный проект и скомпилировать модуль обработки аннотаций перед модулем, который его использует. И это работает.

3. @IgorDumchykov Хорошо, я соответствующим образом обновлю свой ответ.

4. Есть ли способ заставить maven сначала опубликовать модуль с помощью процессора аннотаций? А также включить его в разрешение цепочки зависимостей?

5. @PawelVeselov Единственный способ, который я вижу (также описанный в ответе), — это добавить зависимость к модулю процессора аннотаций в модуле, где вам нужен процессор. Для этого вы можете использовать области <предоставлено> или <время выполнения>.

Ответ №2:

Вы могли бы скомпилировать свой процессор раньше с помощью отдельного выполнения компилятора.

 <build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <execution>
                    <id>compile-generator</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <includes>
                            <include>com/example/YourProcessor.java</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
 

Я протестировал это, и это работает — процессор вызывается позже на этапе фактической компиляции.

Если вы предварительно скомпилируете некоторые другие классы из того же проекта, вы можете напрямую ссылаться на них и использовать их в процессоре. Это может быть полезно.

Комментарии:

1. Спасибо за совет, это работает, но класс должен использовать разделитель пути char / вместо .