Извлечение артефактов 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 здесь.