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

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

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

I have to specify the location of the remote Maven repository I like to fetch an artifact based on it's groupId + artifactId + version The API have to provide the current remote version of the artifact (think about SNAPSHOT artifacts which are regularly built so they have a generated part in their versions) Return the location of the artifact, a HTTP URL is preferred (i'll fetch it on my own with eg. Apache HTTP Client) Optionally retreive the artifact's which are the dependants of the requested one.
 NagyI10 мая 2012 г., 18:05
Я попробую.
 Mark O'Connor10 мая 2012 г., 23:27
Некоторые варианты плюща, перечисленные здесь:stackoverflow.com/questions/3955209/…
 khmarbaise10 мая 2012 г., 18:03
Похоже, вы пытаетесь заново изобрести колесо с помощью библиотеки Aether. поэтому я бы внимательно изучил библиотеку Aether и мог бы спросить в их списке рассылки, чтобы узнать, существует ли возможность использовать другой распознаватель артефактов (загрузка позже и т. д.). Я сомневаюсь, но просто попробуйте.

Ответы на вопрос(4)

Решение Вопроса

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

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

Local repo location, as a directory name List of repote repositories (MavenProject#getRemoteRepositories()) Maven coordinates of the artifact Maven scope to look for

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

 08 апр. 2014 г., 15:52
Не стесняйтесь снимать это на Github:github.com/jcabi/jcabi-aether/stargazers :)
 NagyI24 июн. 2012 г., 18:39
Я принимаю это, потому что это выглядит как самая близкая вещь для моих нужд и кажется простым в использовании.
 08 апр. 2014 г., 14:11
Спасибо за ваш замечательный проект. Я считаю это полезным при тестировании плагинов maven (издевательство над поведением извлечения артефактов).

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

 10 мая 2012 г., 19:32
@Michal Kalinowski, приведенный вами пример показывает, как использовать Aether в плагине maven. Знаете ли вы какие-либо документы, которые показывают, как использовать его в обычной (не плагин) Java-программе?
 NagyI10 мая 2012 г., 17:23
Одна из проблем, которые мне не нравятся при использовании эфира, заключается в том, что мне нужно создать временное хранилище только для загрузки в него артефакта. Я не хочу, чтобы эфир загружал файл. Я просто хочу узнать, какая последняя версия артефакта и где он находится в сети. Представьте, что у меня есть почтовый индекс распространения приложения, в котором нет никаких зависимых артефактов, поэтому он просто стоит один. Я могу легко получить это самостоятельно или даже лучше распаковать его на лету во время загрузки.

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

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

 NagyI10 мая 2012 г., 18:06
Понимаю. Тогда я буду копать глубже в Айви. Спасибо!
 NagyI10 мая 2012 г., 17:26
Это не совсем программно. Ему нужны предопределенные XML-файлы, которые определяют зависимости и другие конфигурации. Что если они определяются динамически во время выполнения (извлекается из внешнего источника)? Я не хотел бы иметь временные файлы повсюду.
 10 мая 2012 г., 18:04
Я думаю, что вам могут понадобиться эти файлы для определения местоположения удаленного репо, но, надеюсь, вам не понадобится использовать файлы конфигурации для получения определенных зависимостей. Gradle и SBT используют ivy для получения зависимостей, и я думаю, что они делают это без конфигурационных файлов xml.
    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;
}
 24 апр. 2015 г., 14:45
Можете ли вы предложить, как сделать это с более новыми Maven и Eclipse Aether?

Ваш ответ на вопрос