我在寫一個需要了解給定的org.apache.maven.model.Dependency
的傳遞依賴關係的Maven 3插件。我怎樣才能做到這一點?查找Maven依賴項對象的依賴關係
回答
所以下面的代碼應該給你的印象如何做到這一點。
@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
爲getArtifacts()
。
Tunaki的建議將適用於任何不屬於您的項目的工件......問題是您真正需要的是什麼?
在Maven中3,您可以訪問所有依賴於基於樹的形式,通過依託maven-dependency-tree
共享組件:
基於樹的API,用於Maven項目依賴的分辨率。
該組件引入了可以爲給定的Maven項目構建依賴關係樹的DependencyGraphBuilder
。您還可以使用ArtifactFilter
過濾工件,該工件有幾個內置實現可以通過groupId,artifactId(IncludesArtifactFilter
和ExcludesArtifactFilter
),作用域(ScopeArtifactFilter
)等進行過濾。如果過濾器爲null
,則保留所有依賴關係。
對於您的情況,由於您定位了特定的工件,因此可以使用工件的模式groupId:artifactId
添加IncludesArtifactFilter
。示例代碼爲:
@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類,但該示例完全符合我的要求,因此應該是可接受的答案。 – codewing
- 1. Maven找出依賴關係
- 2. 依賴的Maven副本依賴關係
- 3. Maven依賴關係
- 4. Maven依賴關係
- 5. Maven:查找非託管依賴關係
- 6. 查找YouTube依賴關係
- 7. 查找dll依賴關係
- 8. 查找列依賴關係
- 9. 查找AAR依賴關係
- 10. 查找依賴關係及其依賴項
- 11. Javascript對象依賴關係
- 12. 在Maven中自動下載依賴項的依賴關係
- 13. AbstractHandler的Maven依賴關係
- 14. sqlserver2010的maven依賴關係?
- 15. LibreOffice Maven的依賴關係?
- 16. maven依賴關係的API
- 17. com.day.util的Maven依賴關係
- 18. 依賴關係的nuget依賴關係
- 19. maven程序集 - 忽略zip依賴關係的依賴關係
- 20. NetBeans中的Maven項目:如何向「依賴關係」和「測試依賴關係」添加依賴關係?
- 21. maven force重建依賴項目(首先構建依賴關係)
- 22. Zest Eclipse Maven依賴關係
- 23. Grails依賴關係或Maven
- 24. 碼頭maven依賴關係
- 25. Pentaho maven/gradle依賴關係
- 26. Maven傳遞依賴關係
- 27. Maven - 建立依賴關係
- 28. Maven插件依賴關係
- 29. Maven依賴關係for org.apache.poi.POIXMLDocument
- 30. 瞭解Maven依賴關係
該插件的用途是什麼?看看maven-dependency-plugin代碼....除此之外,你沒有定義mojo上的DependencyResolution? – khmarbaise
你需要的不僅僅是一個'依賴關係'。您需要訪問'MavenProject',因爲解決的傳遞依賴依賴於潛在的衝突解決。 – Tunaki
@Tunaki我在Maven 3插件中,所以我也有一個'MavenProject'。 –