#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 / вместо .