查找 Maven Dependency 对象的依赖项
Find dependencies of a Maven Dependency object
我正在编写一个 Maven 3 插件,它需要知道给定 org.apache.maven.model.Dependency
的传递依赖关系。我该怎么做?
在 Maven 3 中,您可以通过依赖 maven-dependency-tree
共享组件以基于树的形式访问所有依赖项:
A tree-based API for resolution of Maven project dependencies.
该组件引入了 DependencyGraphBuilder
可以为给定的 Maven 项目构建依赖树。您还可以使用 ArtifactFilter
过滤工件,它有几个内置实现可以按 groupId、artifactId(IncludesArtifactFilter
和 ExcludesArtifactFilter
)、范围(ScopeArtifactFilter
)进行过滤等。如果过滤器是 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);
}
}
}
这可以访问依赖树的根节点,即当前项目。从该节点,您可以通过调用 getChildren()
方法访问所有子节点。所以如果你想列出所有的依赖关系,你可以递归地遍历那个图。该组件确实提供了使用 CollectingDependencyNodeVisitor
执行此操作的工具。它会将所有依赖项收集到一个 List
中以便轻松循环。
对于 Maven 插件,因此需要以下依赖项:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-dependency-tree</artifactId>
<version>3.0</version>
</dependency>
所以下面的代码应该会给你一个印象。
@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 的建议适用于不属于您项目的任何类型的工件...问题是您真正需要什么?
我正在编写一个 Maven 3 插件,它需要知道给定 org.apache.maven.model.Dependency
的传递依赖关系。我该怎么做?
在 Maven 3 中,您可以通过依赖 maven-dependency-tree
共享组件以基于树的形式访问所有依赖项:
A tree-based API for resolution of Maven project dependencies.
该组件引入了 DependencyGraphBuilder
可以为给定的 Maven 项目构建依赖树。您还可以使用 ArtifactFilter
过滤工件,它有几个内置实现可以按 groupId、artifactId(IncludesArtifactFilter
和 ExcludesArtifactFilter
)、范围(ScopeArtifactFilter
)进行过滤等。如果过滤器是 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);
}
}
}
这可以访问依赖树的根节点,即当前项目。从该节点,您可以通过调用 getChildren()
方法访问所有子节点。所以如果你想列出所有的依赖关系,你可以递归地遍历那个图。该组件确实提供了使用 CollectingDependencyNodeVisitor
执行此操作的工具。它会将所有依赖项收集到一个 List
中以便轻松循环。
对于 Maven 插件,因此需要以下依赖项:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-dependency-tree</artifactId>
<version>3.0</version>
</dependency>
所以下面的代码应该会给你一个印象。
@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 的建议适用于不属于您项目的任何类型的工件...问题是您真正需要什么?