2016-02-13 195 views
2

我在寫一個需要了解給定的org.apache.maven.model.Dependency的傳遞依賴關係的Maven 3插件。我怎樣才能做到這一點?查找Maven依賴項對象的依賴關係

+1

該插件的用途是什麼?看看maven-dependency-plugin代碼....除此之外,你沒有定義mojo上的DependencyResolution? – khmarbaise

+1

你需要的不僅僅是一個'依賴關係'。您需要訪問'MavenProject',因爲解決的傳遞依賴依賴於潛在的衝突解決。 – Tunaki

+0

@Tunaki我在Maven 3插件中,所以我也有一個'MavenProject'。 –

回答

1

所以下面的代碼應該給你的印象如何做到這一點。

@Mojo(name = "test", requiresDependencyResolution = ResolutionScope.COMPILE, defaultPhase = LifecyclePhase.PACKAGE ...) 
public class TestMojo 
    extends AbstractMojo 
{ 
    @Parameter(defaultValue = "${project}", readonly = true) 
    private MavenProject project; 

    public void execute() 
     throws MojoExecutionException, MojoFailureException 
    { 
     List<Dependency> dependencies = project.getDependencies(); 
     for (Dependency dependency : dependencies) 
     { 
      getLog().info("Dependency: " + getId(dependency)); 
     } 

     Set<Artifact> artifacts = project.getArtifacts(); 
     for (Artifact artifact : artifacts) 
     { 
      getLog().info("Artifact: " + artifact.getId()); 
     } 
    } 

    private String getId(Dependency dep) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append(dep.getGroupId()); 
     sb.append(':'); 
     sb.append(dep.getArtifactId()); 
     sb.append(':'); 
     sb.append(dep.getVersion()); 
     return sb.toString(); 
    } 

} 

上面的代碼會給你解決的工件以及依賴關係。您需要在依賴關係之間做出區分(在這種情況下,不需要傳遞項目依賴項,也不需要傳遞解決方案的工件)。

最重要的是requiresDependencyResolution = ResolutionScope.COMPILE否則你會得到nullgetArtifacts()

Tunaki的建議將適用於任何不屬於您的項目的工件......問題是您真正需要的是什麼?

5

在Maven中3,您可以訪問所有依賴於基於樹的形式,通過依託maven-dependency-tree共享組件:

基於樹的API,用於Maven項目依賴的分辨率。

該組件引入了可以爲給定的Maven項目構建依賴關係樹的DependencyGraphBuilder。您還可以使用ArtifactFilter過濾工件,該工件有幾個內置實現可以通過groupId,artifactId(IncludesArtifactFilterExcludesArtifactFilter),作用域(ScopeArtifactFilter)等進行過濾。如果過濾器爲null,則保留所有依賴關係。

對於您的情況,由於您定位了特定的工件,因此可以使用工件的模式groupId:artifactId添加IncludesArtifactFilter。示例代碼爲:

@Mojo(name = "foo") 
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(hint = "default") 
    private DependencyGraphBuilder dependencyGraphBuilder; 

    public void execute() throws MojoExecutionException, MojoFailureException { 
     ArtifactFilter artifactFilter = new IncludesArtifactFilter(Arrays.asList("groupId:artifactId")); 
     ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); 
     buildingRequest.setProject(project); 
     try { 
      DependencyNode rootNode = dependencyGraphBuilder.buildDependencyGraph(buildingRequest, artifactFilter); 
      CollectingDependencyNodeVisitor visitor = new CollectingDependencyNodeVisitor(); 
      rootNode.accept(visitor); 
      for (DependencyNode node : visitor.getNodes()) { 
       System.out.println(node.toNodeString()); 
      } 
     } catch (DependencyGraphBuilderException e) { 
      throw new MojoExecutionException("Couldn't build dependency graph", e); 
     } 
    } 

} 

這可以訪問依賴關係樹的根節點,即當前項目。從該節點,您可以通過調用getChildren()方法來訪問所有孩子。所以如果你想列出所有的依賴關係,你可以遞歸地遍歷該圖。該組件確實爲CollectingDependencyNodeVisitor提供了一個工具。它會將所有依賴關係收集到List中以輕鬆循環。

對於Maven插件,下面的依賴性因此,有必要:

<dependency> 
    <groupId>org.apache.maven.shared</groupId> 
    <artifactId>maven-dependency-tree</artifactId> 
    <version>3.0</version> 
</dependency> 
+1

儘管它沒有使用Dependency類,但使用了DependencyNode類,但該示例完全符合我的要求,因此應該是可接受的答案。 – codewing