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

Я создал пользовательскую аннотацию 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. Скомпилируйте остальные классы

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


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


Ответы (1)


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

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

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

person Sean Patrick Floyd    schedule 07.01.2014