Ich muss zugeben, ich habe nie ein Maven-Plugin geschrieben und sah Ihre Frage als eine gute Lernübung. Ich lieh mir stark aus dem Maven Guide to Developing Java Plugins und dem Quellcode aus dem maven-dependency-plugin.
Ich könnte falsch sein, aber ich glaube nicht, dass es eine direkte Zuordnung zwischen Artefakt und Repository, die irgendwo von Maven gespeichert ist.
Ich war für einige Zeit ein Maven-Benutzer und Sie sehen Maven häufig jedes Remote-Repository abfragen, um den Speicherort eines bestimmten Artefakts zu ermitteln. Daher werden Sie in meinem unten stehenden Code keine einzige URL für ein Artefakt erhalten. Sie erhalten so viele URLs, wie es Remote-Repositories gibt. Sie können diesen Code jederzeit erweitern, um zu versuchen, das Artefakt herunterzuladen und die URLs beizubehalten, bei denen der Download erfolgreich ist.
Ich hoffe, das hilft.
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);
}
}
}
Es ist ein Schritt in die richtige Richtung. Ich bekomme immer noch nicht die endgültige Adresse, aber zumindest bekomme ich eine Liste mit gültigen Kandidaten. Ich hatte ein Problem mit der MavenProject-Komponente in meiner Instanz (musste @ parameter expression = "$ {project}" hinzufügen, um es zu beheben). – Thomas
Version 2.2.1 der Maven-API gibt an, dass die Artifact-Schnittstelle ein ArtifactRepository zurückgeben kann und dass die ArtifactRepository-Schnittstelle eine getUrl-Funktion hat. Hoffe, das ist kein Ablenkungsmanöver^_ ^ – Thirlan