2016-02-17 8 views
9

Ich versuche, Informationen über alle Abhängigkeiten (rekursiv) in meinem Projekt verwendet zu extrahieren. Es scheint, als ob die MavenProject-Klasse alle Informationen liefert, die ich benötige. Aber ich kann nicht herausfinden, wie eine Instanz von Artifact in eine Instanz verwandeln von MavenProjectMaven Plugin API: Holen MavenProject von Artefakt

/** 
* 
* 
* @reqiresDependencyResolution 
* 
*/ 
@Mojo(name = "license-overview", defaultPhase = LifecyclePhase.PROCESS_SOURCES) 
public class MyMojo extends AbstractMojo { 


    /** 
    * @parameter default-value="${project}" 
    * @required 
    * @readonly 
    */ 
    MavenProject project; 


    public void execute() throws MojoExecutionException { 

     Set<Artifact> artifacts= project.getArtifacts(); 
     for (Artifact artifact : artifacts) { 
      //Here I need to access the artifact's name, license, author, etc. 
      System.out.println("*** "+artifact.getArtifactId()+"***"); 
     } 

    } 
} 

Wie die Informationen zuzugreifen, die innerhalb der pom meiner Abhängigkeit befindet, aber nicht über die Artifact s Getter exportiert ?

Antwort

8

Ja, das ist möglich.

Wir können ein Projekt im Speicher mit dem ProjectBuilder API bauen:

Bauen In-Memory-Beschreibungen von Projekten.

Durch das Aufrufen der build(projectArtifact, request) Methode mit dem Artefakt wir interessiert sind und ein ProjectBuildingRequest (das hält verschiedene Parameter wie Position der Remote/Local-Repositories, etc.), wird dies eine MavenProject im Speicher aufzubauen.

Betrachten Sie das folgende MOJO, die den Namen aller Abhängigkeiten gedruckt wird:

@Mojo(name = "foo", requiresDependencyResolution = ResolutionScope.RUNTIME) 
public class MyMojo extends AbstractMojo { 

    @Parameter(defaultValue = "${project}", readonly = true, required = true) 
    private MavenProject project; 

    @Parameter(defaultValue = "${session}", readonly = true, required = true) 
    private MavenSession session; 

    @Component 
    private ProjectBuilder projectBuilder; 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); 
     try { 
      for (Artifact artifact : project.getArtifacts()) { 
       buildingRequest.setProject(null); 
       MavenProject mavenProject = projectBuilder.build(artifact, buildingRequest).getProject(); 
       System.out.println(mavenProject.getName()); 
      } 
     } catch (ProjectBuildingException e) { 
      throw new MojoExecutionException("Error while building project", e); 
     } 
    } 

} 

Es gibt ein paar Hauptzutaten hier:

  • Die requiresDependencyResolution sagt Maven, dass wir die Abhängigkeiten verlangen vor der Ausführung aufgelöst werden. In diesem Fall habe ich es auf RUNTIME festgelegt, damit alle Kompilierungs- und Laufzeitabhängigkeiten aufgelöst werden. Sie können das natürlich auf ResolutionScope setzen. Sie wollen.
  • Der Projekt Builder wird mit der @Component Annotation injiziert.
  • Eine Standard-Bauanforderung wird mit dem Parameter der aktuellen Maven-Sitzung erstellt. Wir müssen nur das aktuelle Projekt überschreiben, indem wir es explizit auf null setzen, sonst passiert nichts.

Wenn Sie Zugriff auf die MavenProject haben, können Sie dann alle Informationen, drucken Sie es wollen, wie Entwickler usw.

Wenn Sie die Abhängigkeiten (direkt und transitiv) drucken möchten, werden Sie Außerdem müssen Sie setResolveDependencies(true) für die Bauanforderung aufrufen, andernfalls werden sie im erstellten Projekt nicht ausgefüllt.