Java 如何在Maven 3插件中获取依赖关系树?

Java 如何在Maven 3插件中获取依赖关系树?,java,maven,maven-3,aether,Java,Maven,Maven 3,Aether,在Maven 2 mojo中,您可以使用类似的方法来获取依赖关系树: DependencyNode rootNode; try { rootNode = treeBuilder.buildDependencyTree(project, localRepository, artifactFactory, artifactMetadataSource, null, artifactCollector); } catch (DependencyTreeBuilderException

在Maven 2 mojo中,您可以使用类似的方法来获取依赖关系树:

DependencyNode rootNode;
try {
  rootNode = treeBuilder.buildDependencyTree(project, localRepository,
      artifactFactory, artifactMetadataSource, null, artifactCollector);
} catch (DependencyTreeBuilderException e) {
  throw new MojoExecutionException("Failed to create dependency tree.", e);
}
final CollectingDependencyNodeVisitor visitor = new CollectingDependencyNodeVisitor();
rootNode.accept(visitor);
final List<DependencyNode> nodes = visitor.getNodes();
DependencyNode根节点;
试一试{
rootNode=treeBuilder.buildDependencyTree(项目、本地存储库、,
artifactFactory、artifactMetadataSource、null、artifactCollector);
}捕获(DependencyTreeBuilderException e){
抛出新的MojoExecutionException(“未能创建依赖关系树。”,e);
}
最终CollectionDependencyNodeVisitor访问者=新CollectionDependencyNodeVisitor();
接受(访问者);
最终列表节点=visitor.getNodes();

Maven 3的等价物是什么?同时,许多涉及的类已被弃用(
ArtifactCollector
ArtifactMetadataSource
,等等)。

Maven 3用于依赖项解析。在文档底部附近是另一个指向在Maven插件中使用乙醚的链接。

您需要使用(这是Maven 3正在使用的)。我建议在它周围使用一个简单的包装器,名为(我是它的开发人员)。

我还没有在网上找到任何有效的解决方案,所以我查阅了Maven源代码,自己制定了一个解决方案。下面的大部分代码都是从maven源代码复制而来的,我已经用maven 3.5.4对其进行了测试,效果非常好

import org.apache.maven.artifact.artifact;
导入org.apache.maven.artifact.ArtifactUtils;
导入org.apache.maven.execution.MavenSession;
导入org.apache.maven.plugin.AbstractMojo;
导入org.apache.maven.plugin.MojoExecutionException;
导入org.apache.maven.plugins.annotations.Mojo;
导入org.apache.maven.plugins.annotations.Parameter;
导入org.apache.maven.plugins.annotations.ResolutionScope;
导入org.apache.maven.project.DefaultDependencyResolutionRequest;
导入org.apache.maven.project.DependencyResolutionResult;
导入org.apache.maven.project.MavenProject;
导入org.apache.maven.project.ProjectDependenciesResolver;
导入org.eclipse.ether.graph.DependencyFilter;
导入org.eclipse.ether.graph.DependencyNode;
导入org.eclipse.ether.util.filter.AndDependencyFilter;
导入org.eclipse.ether.util.filter.ScopeDependencyFilter;
导入javax.inject.inject;
导入java.util.*;
@Mojo(name=“test Mojo”,requiresDependencyResolution=ResolutionScope.RUNTIME)
公共类TestMojo扩展了AbstractMojo{
@参数(defaultValue=“${project}”,readonly=true,required=true)
私人马文项目;
@参数(defaultValue=“${session}”,readonly=true,required=true)
非公开会议;
@注入
私人项目从属关系解决者从属关系解决者;
public void execute()引发MojoExecutionException异常{
试一试{
集合scopesToResolve=new HashSet();
scopesToResolve.add(“编译”);
scopesToResolve.add(“提供”);
scopesToResolve.add(“运行时”);
scopesToResolve.add(“系统”);
scopesToResolve.add(“测试”);
Collection scopesToCollect=new HashSet();
scopesToCollect.add(“编译”);
scopesToCollect.添加(“提供”);
scopesToCollect.add(“运行时”);
scopesToCollect.add(“系统”);
scopesToCollect.add(“测试”);
Collection projectArtifacts=new HashSet();
添加(project.getArtifact());
DependencyFilter collectionFilter=新的ScopeDependencyFilter(null,否定(scopesToCollect));
DependencyFilter resolutionFilter=新的ScopeDependencyFilter(null,否定(scopesToResolve));
resolutionFilter=和DependencyFilter.newInstance(collectionFilter,resolutionFilter);
resolutionFilter=和DependencyFilter.newInstance(resolutionFilter、new Reactor或DependencyFilter(项目工件));
DefaultDependencyResolutionRequest请求=
新的DefaultDependencyResolutionRequest(项目,session.getRepositorySession());
请求。设置resolutionFilter(resolutionFilter);
DependencyResolutionResult=dependenciesResolver.resolve(请求);
//这是你的依赖图,你可以用它做任何你想做的事。
List children=result.getDependencyGraph().getChildren();
列出孙辈=子代。get(0.getChildren();
}捕获(例外e){
e、 printStackTrace();
抛出新的MojoExecutionException(例如getMessage());
}
}
私有集合否定(集合作用域)
{
收集结果=新的HashSet();
addAll(结果,“系统”、“编译”、“提供”、“运行时”、“测试”);
for(字符串范围:范围)
{
如果(“编译”。等于(范围))
{
结果。删除(“编译”);
结果:移除(“系统”);
结果:移除(“提供”);
}
else if(“runtime”.equals(scope))
{
结果。删除(“编译”);
结果。删除(“运行时”);
}
else if(“编译+运行时”。等于(范围))
{
结果。删除(“编译”);
结果:移除(“系统”);
结果:移除(“提供”);
结果。删除(“运行时”);
}
else if(“运行时+系统”。等于(范围))
{
结果。删除(“编译”);
结果:移除(“系统”);
结果。删除(“运行时”);
}
否则,如果(“测试”。等于(范围))
{
result.clear();
}
}
返回结果;
}
私有静态类ReactorDependencyFilter
实现DependencyFilter
{
私有集密钥=新的HashSet();
ReactorDependencyFilter(集合工件)
{
for(工件工件:工件)
{
s
<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-common-artifact-filters</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.5.4</version>
    </dependency>
</dependencies>