сканирование java classpath в плагине maven - PullRequest
11 голосов
/ 26 января 2012

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

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

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

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

/ дома / pd5108 / апач-Maven-2.2.1 / загрузки / classworlds-1.1.jar

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 27 января 2012

Обязательные поля класса 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;

Разрешение всех JAR-файлов зависимостей:

 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());
    }

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

1 голос
/ 26 января 2012

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

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

0 голосов
/ 26 января 2012

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

...