2009-09-17 3 views
18

Ich habe ein Maven-Plugin, das eine groupId, eine artifactId und eine Version in seiner Konfiguration akzeptiert.Wie kann ich Maven Artefakte innerhalb eines Plugins herunterladen?

Ich möchte in der Lage sein, dieses Artefakt aus den Remote-Repositories herunterzuladen und die Datei in das Projekt zu kopieren. Ich kann jedoch nicht herausfinden, wie ich das Artefakt herunterladen soll.

Ich verstehe, dass ich Abhängigkeiten mit dem Dependency-Plugin auflösen kann, aber ich muss es in meinem Plugin passieren. Wie kann ich das machen?

Antwort

24

Ihr Plugin muss ein Artefakt mit der ArtifactFactory und der groupId, artifactId und der Version des Artefakts erstellen, das bootstrapped werden soll. Anschließend übergeben Sie dieses Artefakt an einen ArtifactResolver, um die Erkennung/den Download zu verarbeiten.

Der Resolver benötigt Zugriff auf das lokale Repository und die Remote-Repositorys. Die gute Nachricht ist, dass all das Plexus-Komponenten sind, die Sie als Abhängigkeiten in Ihrem Mojo deklarieren können und Plexus sie für Sie einbinden lassen.

In another answer habe ich gezeigt, wie dies zu tun ist. In Ihrem Fall benötigen Sie eine Cut-Down-Version mit etwas anderen Parametern, um die GroupId, ArtifactId und Version zu lesen. Im folgenden Plugin werden die verschiedenen Komponenten als Plexus-Komponenten deklariert und die Eigenschaften zum Deklarieren von GroupId, ArtifactId, Version und Pakettyp.

package name.seller.rich.maven.plugins.bootstrap; 

import java.util.List; 

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.ArtifactResolver; 
import org.apache.maven.plugin.AbstractMojo; 
import org.apache.maven.plugin.MojoExecutionException; 
import org.apache.maven.plugin.MojoFailureException; 

/** 
* Obtain the artifact defined by the groupId, artifactId, and version 
* from the remote repository. 
* 
* @goal bootstrap 
*/ 
public class BootstrapAppMojo extends AbstractMojo { 

    /** 
    * Used to look up Artifacts in the remote repository. 
    * 
    * @parameter expression= 
    * "${component.org.apache.maven.artifact.factory.ArtifactFactory}" 
    * @required 
    * @readonly 
    */ 
    protected ArtifactFactory factory; 

    /** 
    * Used to look up Artifacts in the remote repository. 
    * 
    * @parameter expression= 
    * "${component.org.apache.maven.artifact.resolver.ArtifactResolver}" 
    * @required 
    * @readonly 
    */ 
    protected ArtifactResolver artifactResolver; 

    /** 
    * List of Remote Repositories used by the resolver 
    * 
    * @parameter expression="${project.remoteArtifactRepositories}" 
    * @readonly 
    * @required 
    */ 
    protected List remoteRepositories; 

    /** 
    * Location of the local repository. 
    * 
    * @parameter expression="${localRepository}" 
    * @readonly 
    * @required 
    */ 
    protected ArtifactRepository localRepository; 

    /** 
    * The target pom's artifactId 
    * 
    * @parameter expression="${bootstrapArtifactId}" 
    * @required 
    */ 
    private String bootstrapArtifactId; 

    /** 
    * The target pom's groupId 
    * 
    * @parameter expression="${bootstrapGroupId}" 
    * @required 
    */ 
    private String bootstrapGroupId; 

    /** 
    * The target pom's type 
    * 
    * @parameter expression="${bootstrapType}" 
    * @required 
    */ 
    private String bootstrapType; 

    /** 
    * The target pom's version 
    * 
    * @parameter expression="${bootstrapVersion}" 
    * @required 
    */ 
    private String bootstrapVersion; 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     try { 
      Artifact pomArtifact = this.factory.createArtifact(
       bootstrapGroupId, bootstrapArtifactId, bootstrapVersion, 
       "", bootstrapType); 

      artifactResolver.resolve(pomArtifact, this.remoteRepositories, 
       this.localRepository); 
     } catch (ArtifactResolutionException e) { 
      getLog().error("can't resolve parent pom", e); 
     } catch (ArtifactNotFoundException e) { 
      getLog().error("can't resolve parent pom", e); 
     } 
    } 
} 

Dies ist ein Beispiel für ein pom das Plugin zu verwenden, konfiguriert (und die aspectjrt 1.6.4 pom Download):

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>bootstrap-test</artifactId> 
    <version>1.0.0</version> 
    <build> 
     <plugins> 
     <plugin> 
      <groupId>name.seller.rich</groupId> 
      <artifactId>maven-bootstrap-plugin</artifactId> 
      <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
       <goal>bootstrap</goal> 
       </goals> 
       <configuration> 
       <bootstrapGroupId>org.aspectj</bootstrapGroupId> 
       <bootstrapArtifactId>aspectjrt</bootstrapArtifactId> 
       <bootstrapVersion>1.6.4</bootstrapVersion> 
       <bootstrapType>pom</bootstrapType> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
+0

wow, danke. Ich werde es versuchen –

+0

danke nochmal, es funktioniert gut. Was ist ein guter Weg, um ein Maven-Projekt für die heruntergeladene Datei zu bekommen? –

+0

Nun, das ist wirklich eine separate Frage: -/ –