查找Maven依赖项对象的依赖项

Dan*_*ich 2 maven-plugin maven-3 maven

我正在编写一个Maven 3插件,需要知道给定的传递依赖性org.apache.maven.model.Dependency.我怎样才能做到这一点?

Tun*_*aki 7

在Maven 3中,您可以依赖maven-dependency-tree共享组件以基于树的形式访问所有依赖项:

基于树的API,用于解决Maven项目依赖关系.

该组件引入了DependencyGraphBuilder可以为给定的Maven项目构建依赖关系树的组件.您还可以使用a来过滤工件ArtifactFilter,该工件具有几个内置实现,可以按groupId,artifactId(IncludesArtifactFilterExcludesArtifactFilter),scope(ScopeArtifactFilter)等进行过滤.如果fiter是null,则保留所有依赖项.

在您的情况下,由于您定位了特定工件,因此可以添加IncludesArtifactFilter具有groupId:artifactId工件模式的工件.示例代码如下:

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

}
Run Code Online (Sandbox Code Playgroud)

这样可以访问依赖关系树的根节点,该树是当前项目.从该节点,您可以通过调用该getChildren()方法访问所有chidren .因此,如果要列出所有依赖项,可以递归遍历该图.该组件确实提供了使用该组件执行此操作的工具CollectingDependencyNodeVisitor.它会将所有依赖项收集到a中,List以便轻松地遍历它.

对于Maven插件,因此需要以下依赖项:

<dependency>
    <groupId>org.apache.maven.shared</groupId>
    <artifactId>maven-dependency-tree</artifactId>
    <version>3.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)