То, что я пытаюсь сделать, это написать некоторый плагин Maven, который сканирует классы приложений, которые ищут реализацию определенного интерфейса (это могут быть классы с некоторой аннотацией) и основы для результата, генерирующего некоторый код. Я успешно реализовал плагин, запущенный на фазе генерации источников и написав исходный код в каталог сгенерированных источников.
Проблема заключается в сканировании пути к конкретным реализациям/классам интерфейса с некоторой аннотацией. Я использую библиотеку Reflections для сканирования классов следующим образом:
private Set<Class< ? extends MyInterface >> scan(final String packageName) {
final Reflections reflections = new Reflections(packageName);
return reflections.getSubTypesOf(MyInterface.class);
}
К сожалению, этот метод возвращает пустой набор. Когда я печатаю свой classpath в классе, расширяющем org.apache.maven.plugin.AbstractMojo
(тот, в котором я использую Reflections), я получаю следующий результат:
/home/pd5108/apache-maven-2.2.1/boot/classworlds-1.1.jar
Классы, которые я хочу найти с помощью Reflections, существуют в зависимых JAR, а также в модуле, в котором настроен плагин. Глядя на распечатку класса, кажется, что на данный момент (фаза генерации-источников) зависимости, определенные в maven, все еще не доступны на пути к классам - вероятно, они добавляются на следующих этапах. Это правда? Есть ли другой подход, который я могу использовать?
Вот как печатается путь к классам:
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
for(int i=0; i< urls.length; i++) {
System.out.println(urls[i].getFile());
}