Извлечение артефактов Maven программно

Я ищу Java API, который можно использовать для восстановления артефактов Maven из удаленного репозитория. Я нашел Eclipse Ather до сих пор, но он выглядит сложнее для моих нужд, поэтому я ищу что-то более простое.

Что мне нужно:

  • Мне нужно указать расположение удаленного репозитория Maven
  • Мне нравится получать артефакт на основе его groupId + artifactId + version
  • API должен предоставить текущую удаленную версию артефакта (подумайте о артефактах SNAPSHOT, которые регулярно создаются, поэтому они имеют сгенерированную часть в своих версиях).
  • Верните местоположение артефакта, предпочтительнее URL-адрес HTTP (я сам выберу его, например, с помощью HTTP-клиента Apache)
  • Необязательно отыскивать артефакт, который является иждивенцем запрошенного.

Ответ 1

jcabi-эфир может помочь вам (я разработчик). Это простая оболочка вокруг эфира, которая позволяет находить все транзитивные зависимости артефакта Maven:

File repo = this.session.getLocalRepository().getBasedir();
Collection<Artifact> deps = new Aether(this.getProject(), repo).resolve(
  new DefaultArtifact("junit", "junit-dep", "", "jar", "4.10"),
  JavaScopes.RUNTIME
);

Таким образом, все, что вам нужно предоставить в качестве ввода, это:

  • Локальное местоположение репо, как имя каталога
  • Список репозиториев repote (MavenProject#getRemoteRepositories())
  • Maven координаты артефакта
  • Возможности Maven для поиска

Абсолютные пути каждой найденной зависимости можно получить как Artifact#getPath()

Ответ 2

    public List<Artifact> findDependencies(Artifact artifact) throws DependencyCollectionException {

    CollectRequest collectRequest = new CollectRequest();
    collectRequest.setRoot( new Dependency(artifact, "" ) );
    collectRequest.addRepository(repository);

    final MavenServiceLocator locator = new MavenServiceLocator();
    locator.addService( RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class );
    locator.addService( RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class );
    locator.setServices( WagonProvider.class, new WagonProvider() {
        public Wagon lookup(String roleHint) throws Exception {
            if (Arrays.asList("http", "https").contains(roleHint)) {
                return new LightweightHttpWagon();
            }
            return null;
        }

        public void release(Wagon wagon) {

        }
    });

    final RepositorySystem system = locator.getService(RepositorySystem.class);
    MavenRepositorySystemSession session = new MavenRepositorySystemSession();

    session.setLocalRepositoryManager( system.newLocalRepositoryManager(localRepository) );
    session.setTransferListener( new LoggingTransferListener() );
    session.setRepositoryListener( new LoggingRepositoryListener() );

    final List<Artifact> artifacts = new ArrayList<Artifact>();

    system.collectDependencies(session, collectRequest).getRoot().accept( new DependencyVisitor() {
        public boolean visitEnter(DependencyNode dependencyNode) {
            artifacts.add(dependencyNode.getDependency().getArtifact());
            return true;
        }

        public boolean visitLeave(DependencyNode dependencyNode) {
            return true;
        }
    });
    return artifacts;
}

Ответ 3

Эфир шумит на самом деле довольно простой и изящный способ сделать это. Это одно из основных усовершенствований в Maven 3 и многие искали его. Посмотрите этот для некоторого исходного кода для работы. Я не помню метод получения точного URL-адреса артефакта, но другие требования поддерживаются AFAIR.

Ответ 4

Вы пробовали использовать Apache Ivy? Он поддерживает выборки зависимостей maven.

Документация для этого варианта использования немного редка, но я нашел некоторую информацию о программном использовании Ivy здесь.