【问题标题】:Find dependencies of a Maven Dependency object查找 Maven 依赖项对象的依赖项
【发布时间】:2016-05-24 13:03:18
【问题描述】:

我正在编写一个 Maven 3 插件,它需要知道给定 org.apache.maven.model.Dependency 的传递依赖关系。我该怎么做?

【问题讨论】:

  • 插件的用途是什么?看看 maven-dependency-plugin 代码....除此之外,您没有在 mojo 上定义 DependencyResolution 吗?
  • 您需要的不仅仅是Dependency。您需要访问MavenProject,因为已解决的传递依赖项取决于潜在的冲突解决方案。
  • @Tunaki 我在一个 Maven 3 插件中,所以我也有一个 MavenProject
  • 顺便问一下,你想要所有解决的依赖,所有的依赖(包括排除一个),冲突解决之前还是之后的依赖?
  • @DanFabulich 首先你没有回答我的问题..除此之外,什么代码被完全弃用了?通常一个插件总是在一个项目的上下文中......

标签: maven maven-3 maven-plugin


【解决方案1】:

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

用于解析 Maven 项目依赖项的基于树的 API。

这个组件引入了DependencyGraphBuilder,它可以为给定的Maven项目构建依赖树。您还可以使用ArtifactFilter 过滤工件,它有几个内置实现可以按 groupId、artifactId(IncludesArtifactFilterExcludesArtifactFilter)、范围(ScopeArtifactFilter)等进行过滤。如果拟合器是 @ 987654328@,保留所有依赖项。

在您的情况下,由于您针对特定工件,您可以添加 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);
        }
    }

}

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

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

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

【讨论】:

  • 尽管它没有使用 Dependency 类而是 DependencyNode 类,但该示例完全符合我的要求,因此应该是公认的答案。
【解决方案2】:

所以下面的代码应该给你一个印象如何去做。

@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,否则你会得到null for getArtifacts()

Tunaki 的建议适用于不属于您项目的任何类型的工件...问题是您真正需要什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2014-06-23
    • 1970-01-01
    • 2017-09-18
    • 2016-10-01
    • 2020-04-18
    • 2012-11-18
    相关资源
    最近更新 更多