Je dois admettre que j'ai jamais écrit un plugin Maven avant et vu votre question comme un bon exercice d'apprentissage. J'ai emprunté beaucoup de Maven Guide to Developing Java Plugins et le code source du maven-dependency-plugin.
Je peux me tromper à ce sujet, mais je ne pense pas qu'il existe une correspondance directe entre l'artefact et le dépôt qui est stocké n'importe où par Maven.
J'ai été un utilisateur de Maven pendant un certain temps et vous voyez souvent Maven interroger chaque référentiel distant pour déterminer l'emplacement d'un artefact donné. Par conséquent, dans mon code ci-dessous, vous n'obtiendrez pas une seule URL pour un artefact, vous obtiendrez autant d'URL que de dépôts distants. Vous pouvez toujours étendre ce code pour tenter de télécharger l'artefact et de conserver les URL sur lesquelles le téléchargement a réussi.
J'espère que cela aide.
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);
}
}
}
C'est un pas dans la bonne direction. Je n'ai toujours pas l'adresse finale, mais au moins j'ai une liste de candidats valides. J'ai eu un problème avec le composant MavenProject sur mon instance (j'ai dû ajouter @parameter expression = "$ {projet}" pour le réparer). – Thomas
La version 2.2.1 de l'API Maven indique que l'interface Artefact peut renvoyer un objet ArtifactRepository et que l'interface ArtifactRepository possède une fonction getUrl. J'espère que ce n'est pas un hareng rouge^_ ^ – Thirlan