Программное получение эффективного POM с использованием Maven Resolver Provider - PullRequest
7 голосов
/ 05 апреля 2019

Что я хочу сделать?

  • Имеется файл POM в локальной файловой системе.
  • Я хочу программно получить эффективное POM этого файла POM. В частности, я хочу сделать следующее:

    • Разрешить зависимости POMs
    • Убедитесь, что все родительские POM обработаны
    • Получить список зависимостей полностью разрешенного POM
    • И так далее ...
  • Мне не нужно получать транзитивные зависимости.

Что работает?

Я использую Maven Resolver Provider , который работает. тем не мение Я должен использовать пакет частного класса org.apache.maven.repository.internal.DefaultModelResolver

Вот ссылка GitHub на пример проекта Maven, который вы можете запустить: https://github.com/sahilm/maven-resolver-test

Пример программы делает следующее:

  • Загрузка последней версии POM для весенней загрузки из Maven Central.
  • Распечатывает его прямые зависимости (с включенным родительским deps)

Вы можете запустить программу с: mvn exec:java -Dexec.mainClass="com.sahilm.maven_resolver_test.Test"

В чем мне нужна помощь?

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

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Вы можете создать (в своем проекте) открытый класс в пакете: org.apache.maven.repository.internal, который расширяет класс доступности пакета.Просто используйте имя класса, которое не может быть использовано продавцом в фурутре.

package org.apache.maven.repository.internal;
public class VisibleDefaultModelResolver extends DefaultModelResolver{

    public VisibleDefaultModelResolver(RepositorySystemSession session, RequestTrace trace, String context, ArtifactResolver resolver, VersionRangeResolver versionRangeResolver, RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories) {
        super(session, trace, context, resolver, versionRangeResolver, remoteRepositoryManager, repositories);
    }

}

Тогда ваш код станет:

ModelResolver modelResolver = new VisibleDefaultModelResolver(session, requestTrace, "context", artifactResolver, versionRangeResolver, remoteRepositoryManager, repos);
1 голос
/ 10 апреля 2019

Может быть, вы можете использовать ProjectModelResolver.Вот фрагмент кода,

    DefaultRepositorySystem repositorySystem =
            new DefaultRepositorySystem();
    repositorySystem.initService(locator);

    ModelResolver modelResolver =
            new ProjectModelResolver(session, requestTrace,
                    repositorySystem, remoteRepositoryManager, repos,
                    ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT,
                    null);

Я включил рабочий код здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...