How to get access to Maven's dependency hierarchy within a plugin

前端 未结 7 1669
生来不讨喜
生来不讨喜 2020-11-29 05:25

In my plugin I need to process the dependency hierarchy and get information (groupId, artifactId, version etc) about each dependency and if it was excluded. What is the best

7条回答
  •  佛祖请我去吃肉
    2020-11-29 05:33

    For Maven 3 you can use DependencyGraphBuilder. It does pretty much the same thing as DependencyTreeBuilder.

    Here is the example

        import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
        import org.apache.maven.artifact.resolver.filter.IncludesArtifactFilter;
        import org.apache.maven.execution.MavenSession;
        import org.apache.maven.model.Dependency;
        import org.apache.maven.plugins.annotations.ResolutionScope;
        import org.apache.maven.plugins.annotations.LifecyclePhase;
        import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
    
        import org.apache.maven.shared.dependency.graph.DependencyNode;
        import org.apache.maven.shared.dependency.graph.traversal.CollectingDependencyNodeVisitor;
    
        public class AnanlyzeTransitiveDependencyMojo extends AbstractMojo{
    
            @Parameter(defaultValue = "${project}", readonly = true, required = true)
            private MavenProject project;
    
            @Parameter(defaultValue = "${session}", readonly = true, required = true)
            private MavenSession session;
    
            @Component(hint="maven3")
            private DependencyGraphBuilder dependencyGraphBuilder;
    
            @Override
            public void execute() throws MojoExecutionException, MojoFailureException {
        // If you want to filter out certain dependencies.
                 ArtifactFilter artifactFilter = new IncludesArtifactFilter("groupId:artifactId:version");
                 ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
                 buildingRequest.setProject(project);
                try{
                   DependencyNode depenGraphRootNode = dependencyGraphBuilder.buildDependencyGraph(buildingRequest, artifactFilter);
                   CollectingDependencyNodeVisitor visitor = new  CollectingDependencyNodeVisitor();
                   depenGraphRootNode.accept(visitor);
                   List children = visitor.getNodes();
    
                   getLog().info("CHILDREN ARE :");
                   for(DependencyNode node : children) {
                       Artifact atf = node.getArtifact();
                }
    }catch(Exception e) {
        e.printStackTrace();
    }
    

提交回复
热议问题