Как получить артефакт Скачать URL через Maven API?
-
04-10-2019 - |
Вопрос
Я пытаюсь создать плагин Maven, чтобы генерировать файл с URL для всех зависимостей в проекте. Я смог получить зависимости и их артефакт, но у меня возникли проблемы с получением URL-адреса загрузки.
Использование ArtifaCtresolver и ArtifactmetAdataSource Я получаю некоторые из артефактной информации. Однако я не могу получить всю информацию для всех зависимостей. Я не смог найти документацию в логике разрешения, чтобы я мог назвать его моим плагином. Я могу использовать Artifactresolver для скачивания артефакта, но то, что я действительно хотел, был просто URL.
Maven Artifact API имеет метод AA под названием GETDONLOADURL (см. http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/artifact.html.). Однако я не могу найти способ получить реальную ценность в нее. Я всегда получаю нулевое значение. Есть ли способ, чтобы он был решен (загрузка или нет) и получить URL для откуда, откуда файл?
Решение
Я должен признать, что у меня есть никогда Написал плагин Maven до и увидел ваш вопрос как хорошее упражнение для обучения. Я позаимствовал тяжело от Руководство по Maven для разработки плагинов Java и исходный код из Maven-зависимость - плагин.
Я могу ошибаться в этом, но я не думаю, что есть прямое сопоставление между артефактом и хранилищем, который хранится в любом месте Maven.
Я уже имел пользователя Maven, и вы часто видите, что Maven Querying каждый удаленный репозиторий выясняет расположение данного артефакта. Поэтому в моем коде ниже вы не получите ни одного URL для артефакта, вы получите столько URL, так как есть удаленные репозитории. Вы всегда можете расширить этот код, чтобы попытаться загрузить артефакт и сохранить URL-адреса, где загрузка успешна.
Надеюсь, это поможет.
package sample.plugin;
import java.util.List;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
/**
* Says "Hi" to the user.
* @goal sayhi
*/
public class GreetingMojo extends AbstractMojo {
/**
* @parameter expression="${localRepository}"
* @readonly
* @required
*/
protected ArtifactRepository local;
/**
* @parameter expression="${project.remoteArtifactRepositories}"
* @readonly
* @required
*/
protected List<ArtifactRepository> remoteRepos;
/**
* @component role="org.apache.maven.project.MavenProjectBuilder"
* @required
* @readonly
*/
protected MavenProjectBuilder mavenProjectBuilder;
/**
* @component
*/
protected ArtifactFactory factory;
/**
* @component
*/
protected MavenProject project;
public void execute() throws MojoExecutionException {
try {
resolveDependencies(project);
} catch (Exception ex) {
getLog().error(ex);
}
}
private void resolveDependencies(MavenProject theProject)
throws ArtifactResolutionException, ArtifactNotFoundException, InvalidDependencyVersionException, ProjectBuildingException {
Set<Artifact> artifacts = theProject.createArtifacts(this.factory, Artifact.SCOPE_TEST,
new ScopeArtifactFilter(Artifact.SCOPE_TEST));
for (Artifact a : artifacts) {
System.out.printf("%s : %s : %s\n", a.getGroupId(), a.getArtifactId(), a.getVersion());
for (ArtifactRepository r : remoteRepos) {
System.out.printf("%s/%s\n", r.getUrl(), r.pathOf(a));
}
System.out.println();
Artifact pomArtifact = this.factory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), "", "pom");
MavenProject pomProject = mavenProjectBuilder.buildFromRepository(pomArtifact, remoteRepos, local);
resolveDependencies(pomProject);
}
}
}