2010-05-26 28 views
6

Próbuję utworzyć wtyczkę maven do generowania pliku z adresem URL do wszystkich zależności w projekcie. Mogłem uzyskać zależności i ich artefakty, ale mam problemy z uzyskaniem adresu URL pobierania.Jak uzyskać URL pobierania artefaktów za pośrednictwem interfejsu API Maven?

Używanie ArtifactResolver i ArtifactMetadataSource Dostaję niektóre informacje o artefakcie. Jednak nie mogę uzyskać wszystkich informacji dla wszystkich zależności. Nie udało mi się znaleźć dokumentacji dotyczącej logiki rozdzielczości, dzięki czemu mogę ją nazwać formą wtyczki. Mogę użyć ArtefaktResolver do pobrania artefaktu, ale to, czego naprawdę chciałem, to tylko URL.

Interfejs API artefaktów Maven ma metodę o nazwie getDownloadURL (patrz http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html). Jednak nie mogę znaleźć sposobu na uzyskanie prawdziwej wartości. Zawsze otrzymuję wartość pustą. Czy istnieje sposób, aby to rozwiązać (pobieranie lub nie) i uzyskać adres URL, skąd pochodzi plik?

Odpowiedz

5

Muszę przyznać, że mam nigdy napisałem plugin Maven wcześniej i zobaczyłem twoje pytanie jako dobre ćwiczenie edukacyjne. Pożyczyłem ciężko od Maven Guide to Developing Java Plugins i kodu źródłowego z maven-dependency-plugin.

Mogę się mylić, ale nie sądzę, że istnieje bezpośrednie odwzorowanie artefaktu i repozytorium przechowywanego w dowolnym miejscu przez Mavena.

Byłem użytkownikiem Mavena od jakiegoś czasu i często widzisz, jak Maven wysyła zapytanie do każdego zdalnego repozytorium, aby ustalić lokalizację danego artefaktu. Dlatego w poniższym kodzie nie dostaniesz jednego adresu URL dla artefaktu, dostaniesz tyle adresów URL, ile jest zdalnych repozytoriów. Zawsze można rozszerzyć ten kod, aby spróbować pobrać artefakt i zachować adresy URL, w których pobieranie się powiedzie.

Mam nadzieję, że to pomoże.

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

To krok we właściwym kierunku. Nadal nie otrzymuję ostatecznego adresu, ale przynajmniej dostaję listę ważnych kandydatów. Miałem problem ze składnikiem MavenProject na mojej instancji (musiałem dodać wyrażenie @parametru = "$ {project}", aby to naprawić). – Thomas

+0

Wersja 2.2.1 interfejsu API Maven wskazuje, że interfejs Artefakt może zwrócić ArtefaktRepository i że interfejs ArtefaktRepository ma funkcję getUrl. Mam nadzieję, że to nie jest czerwony śledź^_ ^ – Thirlan

Powiązane problemy