2010-05-26 17 views
6

Ich versuche, ein Maven-Plugin zu erstellen, um eine Datei mit der URL zu allen Abhängigkeiten in einem Projekt zu generieren. Ich war in der Lage, die Abhängigkeiten und ihr Artefakt zu bekommen, aber ich habe Probleme, die Download-URL zu bekommen.Wie bekomme ich eine Artefakt-Download-URL über Maven API?

Verwenden von ArtifactResolver und ArtifactMetadataSource Ich erhalte einige Artefaktdaten. Allerdings bekomme ich nicht alle Informationen für alle Abhängigkeiten. Ich konnte keine Dokumentation über die Auflösungslogik finden, so dass ich sie als mein Plugin bezeichnen kann. Ich kann ein ArtefaktResolver verwenden, um das Artefakt herunterzuladen, aber was ich wirklich wollte, war nur die URL. Die Maven Artifact API hat eine Methode namens getDownloadURL (siehe http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html). Ich finde jedoch keinen Weg, einen wirklichen Wert darin zu finden. Ich bekomme immer einen Nullwert. Gibt es einen Weg, um es zu lösen (Download oder nicht) und die URL für woher die Datei stammt zu bekommen?

Antwort

5

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

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

+0

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

Verwandte Themen