2010-05-26 4 views
6

J'essaie de créer un plugin maven pour générer un fichier avec l'URL de toutes les dépendances dans un projet. J'ai pu obtenir les dépendances et leur artefact, mais j'ai de la difficulté à obtenir l'URL de téléchargement. En utilisant ArtifactResolver et ArtifactMetadataSource, j'obtiens des informations sur les artefacts. Cependant, je ne parviens pas à obtenir toutes les informations pour toutes les dépendances. Je n'ai pas pu trouver de documentation sur la logique de résolution, pour que je puisse l'appeler à partir de mon plugin. Je peux utiliser un ArtifactResolver pour télécharger l'artefact, mais ce que je voulais vraiment c'était juste l'URL.Comment obtenir une URL de téléchargement Artifact via l'API Maven?

L'API Maven Artifact a une méthode appelée getDownloadURL (voir http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html). Cependant je ne peux pas sembler trouver un moyen d'y avoir une réelle valeur. J'ai toujours une valeur nulle. Existe-t-il un moyen de le résoudre (téléchargement ou non) et obtenir l'URL d'où vient le fichier?

Répondre

5

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); 
     } 
    } 
} 
+0

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

+0

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