我正在用eather在我的代码中重新创建mavendependency:tree的相同结构.
根据文档,我发现这个有用的example可以正确列出与插件相同的依赖关系,但是缺少任何“树”信息,这只是一个简单的列表.
public static void main( String[] args )
throws Exception
{
System.out.println( "------------------------------------------------------------" );
System.out.println( ResolveTransitiveDependencies.class.getSimpleName() );
RepositorySystem system = Booter.newRepositorySystem();
RepositorySystemSession session = Booter.newRepositorySystemSession( system );
Artifact artifact = new DefaultArtifact( "org.eclipse.aether:aether-impl:1.0.0.v20140518" );
DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter( JavaScopes.COMPILE );
CollectRequest collectRequest = new CollectRequest();
collectRequest.setRoot( new Dependency( artifact, JavaScopes.COMPILE ) );
collectRequest.setRepositories( Booter.newRepositories( system, session ) );
DependencyRequest dependencyRequest = new DependencyRequest( collectRequest, classpathFlter );
List<ArtifactResult> artifactResults =
system.resolveDependencies( session, dependencyRequest ).getArtifactResults();
for ( ArtifactResult artifactResult : artifactResults )
{
System.out.println( artifactResult.getArtifact() + " resolved to " + artifactResult.getArtifact().getFile() );
}
}
然后,我编写了另一段代码来检索非传递性依赖关系,并递归调用它,能够获得完整的依赖关系图,但没有任何限制,因此我应该实现一些过滤/限制例程.
由于我想在不引入“我的”过滤的情况下尽可能保持相同的插件逻辑,是否有任何方法可以适应第一个示例以检索层次结构信息?
解决方法:
如果您想要与插件实现的行为完全相同,我建议您研究一下插件的源代码here,这样您就不会错过任何细微差别.但是基本方法是使用collectRequest来collectDependencies,如下所示:
public static void main(String[] args) throws Exception {
System.out.println("------------------------------------------------------------");
RepositorySystem system = Booter.newRepositorySystem();
RepositorySystemSession session = Booter.newRepositorySystemSession(system);
Artifact artifact = new DefaultArtifact("org.apache.maven.plugins:maven-shade-plugin:2.3");
DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE);
CollectRequest collectRequest = new CollectRequest();
collectRequest.setRoot(new Dependency(artifact, JavaScopes.COMPILE));
collectRequest.setRepositories(Booter.newRepositories(system, session));
DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter);
List<ArtifactResult> artifactResults =
system.resolveDependencies(session, dependencyRequest).getArtifactResults();
// for (ArtifactResult artifactResult : artifactResults) {
// System.out.println(artifactResult.getArtifact() + " resolved to " + artifactResult.getArtifact().getFile());
// }
//use collectDependencies to collect
CollectResult collectResult = system.collectDependencies(session, collectRequest);
DependencyNode node = collectResult.getRoot();
node.accept(new TreeDependencyVisitor(new DependencyVisitor() {
String indent = "";
@Override
public boolean visitEnter(DependencyNode dependencyNode) {
System.out.println(indent + dependencyNode.getArtifact());
indent += " ";
return true;
}
@Override
public boolean visitLeave(DependencyNode dependencyNode) {
indent = indent.substring(0, indent.length() - 4);
return true;
}
}));
}
[编辑:]
要包括测试依赖项,您将需要自定义会话的depSelector,如下所示:
DependencySelector depFilter =
new AndDependencySelector(
new ScopeDependencySelector( "provided" ),
new OptionalDependencySelector(),
new ExclusionDependencySelector()
);
并添加classpathFilter进行遍历:
DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.TEST);
node.accept(new TreeDependencyVisitor(new FilteringDependencyVisitor(new DependencyVisitor() {
...
}, classpathFlter)));
不过,这将不完全与dependency:tree相同,因为它实际上将列出所有要测试类路径的罐子.但是实际上,您可以进一步自定义NodeVisitor以过滤所需的内容.
标签:maven,java,aether 来源: https://codeday.me/bug/20191119/2033502.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。