2016-02-17 28 views
9

Próbuję wyodrębnić informacje o wszystkich zależnościach (rekursywnie) używanych w moim projekcie. Wygląda na to, że klasa MavenProject dostarcza wszystkich informacji, których potrzebuję. Ale nie mogę dowiedzieć się, jak przekształcić wystąpienie Artifact do instancji MavenProjectAPI wtyczki Maven: Pobierz MavenProject z artefaktu

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

    } 
} 

Jak uzyskać dostęp do informacji, która znajduje się wewnątrz pom mojego uzależnienia, ale nie jest eksportowana poprzez Artifact s pobierające ?

Odpowiedz

8

Tak, jest to możliwe.

Możemy zbudować projekt w pamięci z ProjectBuilder API:

Buduje w pamięci opisy projektów.

poprzez wywołanie metody build(projectArtifact, request) z artefaktem jesteśmy zainteresowani a ProjectBuildingRequest (który przechowuje różne parametry, takie jak lokalizacja zdalnych/local repozytoria itp), to będzie zbudować MavenProject w pamięci.

Rozważmy następujący MOJO która będzie drukowana nazwa wszystkich zależności:

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

} 

Istnieje kilka głównych składników tutaj:

  • requiresDependencyResolution mówi Maven, które wymagają zależności do być rozwiązane przed wykonaniem. W tym przypadku określiłem to jako RUNTIME, aby rozwiązać wszystkie zależności kompilacji i środowiska wykonawczego. Możesz oczywiście ustawić to na ResolutionScope. chcesz.
  • Kreatorowi projektu wstrzyknięto adnotację @Component.
  • Domyślne żądanie budowlane jest budowane z parametrem bieżącej sesji Mavena. Musimy po prostu zastąpić bieżący projekt, jawnie ustawiając go na null, w przeciwnym razie nic się nie stanie.

Gdy masz dostęp do MavenProject można następnie wydrukować wszystkie potrzebne informacje o tym, jak programistów, itd

Jeśli chcesz wydrukować zależności (bezpośrednie i przechodnia), będziesz należy również wywołać setResolveDependencies(true) na żądanie budynku, w przeciwnym razie nie zostaną one wypełnione w projekcie wbudowanym.