Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Компилятор Maven, компилировать только аннотированные классы

Автор вопроса: Lauri HarpfОтветов: 1

Я создал пользовательскую аннотацию Java (код ниже) в проекте Maven 2, над которым я работаю:

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MYANNOTATION{}

В одной части сборки Maven я хочу только скомпилировать классы, аннотированные этой аннотацией, например:

@MYANNOTATION
public class MyClass {
    // Code here
}

В настоящее время я использую плагин компилятора Maven, чтобы ограничить сложность на основе структуры пакета. . Мой файл pom.xml похож на приведенный ниже, ограничивая компиляцию классами в **com.foo.bar.stuff** и **com.baz.foo.more**. Это неудовлетворительно, потому что, когда я добавляю аннотированные классы в com.xyz.bar.foo, я должен не забыть определить его в файле pom.

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <includes>
                <include>**/com/foo/bar/stuff/**</include>
                <include>**/com/baz/foo/more/**</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Есть ли способ определить Maven для компиляции только классов, которые были аннотированы этой аннотацией, независимо от того, где они расположены в иерархии пакетов?

(Я пытаюсь создать метамодель из классов модели предметной области, чтобы я мог указывать на поля и методы, не определяя имена как строковые константы и изменяя их вручную при рефакторинге)

Изменить: я уже обрабатываю аннотации на другом этапе сборки. Система работает так:

  1. Скомпилировать классы в указанные пакеты
  2. Используя JAnnocessor, создавайте метамодели из классов с @MYANNOTATION.
  3. Скомпилируйте остальные классы

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

  • Обработчик аннотаций будет выполнять обработку классов, которые имеют запрошенную аннотацию, но исходный код должен быть сначала проанализирован компилятором, чтобы можно было найти аннотации. Я вижу единственный способ ограничить входной набор java-файлов для компилятора только теми файлами с набором аннотаций, что-то вроде grep для всего набора исходных файлов (возможно, здесь можно использовать плагин ant). Но даже в этом случае компилятор также загрузит ссылочные классы, и вы все равно можете разобрать все исходное дерево. John Q Citizen 20.10.2014

javamavenmaven-2annotationsmaven-compiler-plugin

Ответы

Ответ 1 · рейтинг 2 · Sean Patrick Floyd

Вы можете сделать что-то похожее на то, что хотите, с обработкой аннотаций. Я не думаю, что вам нужно делать что-то конкретное для maven, но вам нужно написать обработчик аннотаций, который должен быть либо частью отдельной библиотеки, либо компилироваться отдельно.

Концепция обработки аннотаций довольно хорошо объясняется в этой записи блога:

Генерация кода с использованием процессоров аннотаций на языке Java - часть 2: процессоры аннотаций

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы