2014-01-07 2 views
2

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

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 Compiler Plugin ограничить сложность на основе структуры пакета. Мой 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 компилировать только классы, которые были аннотированными с этой аннотацией, не в зависимости от того, где они находятся в иерархии пакетов?

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

Edit: I Я уже делаю обработку аннотации в другой части фазы сборки. Система работает следующим образом:

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

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

+0

процессор аннотаций будет выполнять обработку классов, имеющих требуемый аннотацию, но исходный код нужно будет сначала обрабатывается компилятором, чтобы можно было найти аннотации. Единственный способ, с помощью которого я могу ограничить набор входных данных java-файлов компилятору только этими файлами с набором аннотаций, - это что-то вроде grep по всему набору исходных файлов (возможно, здесь можно использовать ant-плагин). Но даже тогда компилятор также загрузит классы, на которые ссылаются, и в любом случае вы можете разобрать все дерево источников. –

ответ

2

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

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

Code Generation using Annotation Processors in the Java language – part 2: Annotation Processors

Смежные вопросы