2016-02-17 17 views
9

Sto cercando di estrarre informazioni su tutte le dipendenze (ricorsivamente) utilizzate nel mio progetto. Sembra che la classe MavenProject fornisca tutte le informazioni che richiedo. Ma io non riesco a capire come trasformare un'istanza di Artifact in un'istanza di MavenProjectAPI Maven Plugin: Scarica MavenProject da Artifact

/** 
* 
* 
* @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()+"***"); 
     } 

    } 
} 

Come accedere alle informazioni che si trova all'interno del pom della mia dipendenza, ma non viene esportato attraverso il Artifact s getter ?

risposta

8

Sì, questo è possibile.

Siamo in grado di costruire un progetto in-memory con la ProjectBuilder API:

Costruisce descrizioni in memoria di progetti.

richiamando il metodo build(projectArtifact, request) con l'artefatto che ci interessa ed un ProjectBuildingRequest (che contiene vari parametri come la posizione dei repository remoti/locali, etc.), questo costruirà un MavenProject in memoria.

Si consideri il seguente MOJO che stamperà il nome di tutte le dipendenze:

@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); 
     } 
    } 

} 

ci sono un paio di ingredienti principali qui:

  • Il requiresDependencyResolution dice Maven che richiediamo le dipendenze a essere risolto prima dell'esecuzione. In questo caso, l'ho specificato a RUNTIME in modo che tutte le dipendenze di compilazione e runtime siano risolte. Ovviamente è possibile impostarlo su ResolutionScope. tu vuoi.
  • Il builder del progetto viene iniettato con l'annotazione @Component.
  • Una richiesta di costruzione predefinita viene creata con il parametro della sessione Maven corrente. Abbiamo solo bisogno di ignorare il progetto corrente impostandolo esplicitamente su null, altrimenti non accadrà nulla.

Quando si ha accesso al MavenProject, è possibile stampare tutte le informazioni desiderate su di esso, come sviluppatori, ecc

Se si desidera stampare le dipendenze (diretto e transitivo), sarà inoltre è necessario invocare setResolveDependencies(true) per la richiesta di costruzione, altrimenti non verranno compilati nel progetto creato.