сканирование в Java classpath в Maven плагин

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

проблема заключается в сканировании пути к классам для конкретных реализаций/классов интерфейса с некоторые аннотации. Я использую размышления библиотека для сканирования классов следующим образом:

private Set<Class< ? extends MyInterface >> scan(final String packageName) {
  final Reflections reflections = new Reflections(packageName);  
  return reflections.getSubTypesOf(MyInterface.class);
}

к сожалению, этот метод возвращает пустой набор. Когда я печатаю свой путь к классу в классе extending org.apache.maven.plugin.AbstractMojo (то же самое, в котором я использую размышления) Я получаю следующий результат:

/главная/pd5108/Апач-мавен-2.2.1/загрузки/classworlds-1.1.Джар

классы, которые я хочу найти, используя отражения, существуют в dependend JARs, а также в модуле, в котором настроен плагин. Глядя на распечатанный путь к классам, кажется, что на этом этапе (фаза генерации источников) зависимости, определенные в maven, еще не доступны на пути к классам-вероятно, они добавляются на следующих этапах. Это правда? Есть ли другой подход, который я могу использовать?

вот как печатается classpath:

URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();

for(int i=0; i< urls.length; i++) {
  System.out.println(urls[i].getFile());
}

3 ответов


обязательные поля класса MOJO:

    /**
    * The project currently being built.
    *
    * @parameter expression="${project}"
    * @readonly
    * @required
    */
    private MavenProject project;

    /** @parameter expression="${localRepository}" */
    protected ArtifactRepository m_localRepository;

    /**@parameter default-value="${localRepository}" */
    private org.apache.maven.artifact.repository.ArtifactRepository
        localRepository;

    /** @parameter default-value="${project.remoteArtifactRepositories}" */
    private java.util.List remoteRepositories;

    /** @component */
    private org.apache.maven.artifact.factory.ArtifactFactory artifactFactory;

    /** @component */
    private org.apache.maven.artifact.resolver.ArtifactResolver resolver;

разрешение всех зависимостей JARs:

 final List<Dependency> dependencies = project.getDependencies();

    for (Dependency d : dependencies) {

        final Artifact artifact =
            artifactFactory.createArtifactWithClassifier(d.getGroupId(),
                d.getArtifactId(), d.getVersion(), d.getType(),
                d.getClassifier());

        try {
            resolver.resolve(artifact, remoteRepositories,
                    localRepository );
        } catch (ArtifactResolutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ArtifactNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        File artifactFile = artifact.getFile();
        System.out.println(artifactFile.getAbsolutePath());
    }

и теперь нам нужно сканировать эти банки с помощью API отражения, ища соответствующие классы. На данный момент я думаю, что другого пути нет, так как я работаю в generate-sources значения фазы и артефакта для следующих фаз еще не вычислены.


существуют зависимости артефактов, определенные в <dependencies> зависимости раздела и плагина, определенные в разделе <plugin><dependencies>.

зависимости плагинов добавляются в путь к классам, пока я не уверен в зависимостях артефактов. Вы пытались добавить свои зависимости плагина под <plugin><dependencies>?


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