Вопрос по maven, api, java – Извлечение артефактов Maven программно [закрыто]

12

Я ищу 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.
Я попробую. NagyI
Похоже, вы пытаетесь заново изобрести колесо с помощью библиотеки Aether. поэтому я бы внимательно изучил библиотеку Aether и мог бы спросить в их списке рассылки, чтобы узнать, существует ли возможность использовать другой распознаватель артефактов (загрузка позже и т. д.). Я сомневаюсь, но просто попробуйте. khmarbaise
Некоторые варианты плюща, перечисленные здесь:stackoverflow.com/questions/3955209/… Mark O'Connor

Ваш Ответ

4   ответа
0

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

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

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

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

Это не совсем программно. Ему нужны предопределенные XML-файлы, которые определяют зависимости и другие конфигурации. Что если они определяются динамически во время выполнения (извлекается из внешнего источника)? Я не хотел бы иметь временные файлы повсюду. NagyI
Понимаю. Тогда я буду копать глубже в Айви. Спасибо! NagyI
Я думаю, что вам могут понадобиться эти файлы для определения местоположения удаленного репо, но, надеюсь, вам не понадобится использовать файлы конфигурации для получения определенных зависимостей. Gradle и SBT используют ivy для получения зависимостей, и я думаю, что они делают это без конфигурационных файлов xml.
10

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

Я принимаю это, потому что это выглядит как самая близкая вещь для моих нужд и кажется простым в использовании. NagyI
Не стесняйтесь снимать это на Github:github.com/jcabi/jcabi-aether/stargazers :)
Спасибо за ваш замечательный проект. Я считаю это полезным при тестировании плагинов maven (издевательство над поведением извлечения артефактов).
1
    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;
}
Можете ли вы предложить, как сделать это с более новыми Maven и Eclipse Aether?

Похожие вопросы