从树形数据结构(Java)中打印纯文本树

3

I'm a huge fan of

mvn dependency:tree

我想从我的Java程序中输出一个看起来类似的树形结构的纯ASCII文本。

 com.totsp.gwt:maven-gwt-sample:war:1.0-SNAPSHOT
 +- com.google.gwt:gwt-servlet:jar:2.4.0:compile
 +- com.google.gwt:gwt-user:jar:2.4.0:provided
 |  +- javax.validation:validation-api:jar:1.0.0.GA:provided
 |  \- javax.validation:validation-api:jar:sources:1.0.0.GA:provided
 +- log4j:log4j:jar:1.2.14:compile
 \- junit:junit:jar:4.1:test

我希望能找到一个易于使用的库来实现这个功能,但我找不到。
最接近的替代品是这个:http://code.google.com/p/j-text-utils/,但它没有Maven的那么好用。
我在哪里可以找到一个库,以几乎与mvn dependency:tree相同的方式将树形结构打印为文本?

https://dev59.com/K2445IYBdhLWcg3wQX6G#8948691 - Hari Menon
谢谢,但我真的不想编写自己的算法。我想重用肯定存在的最成熟的API。如果有人能告诉我Maven jar中执行此操作的类也可以。 - Sridhar Sarnobat
1
+1 提到 j-text-utils,它绝对足够满足我的类似需求。 - thSoft
2个回答

2
我不是一个创建/使用MOJO的专家,但是你可以下载并查看maven-dependency-plugin。很容易将其作为依赖项添加到您的项目中(我猜您正在通过Maven进行管理),初步看来,您应该直接调用TreeMojo.execute()或类似的方法。
大致上它会做以下事情:
ArtifactFilter artifactFilter = createResolvingArtifactFilter();
rootNode = dependencyTreeBuilder.buildDependencyTree( project,
        localRepository, artifactFactory, artifactMetadataSource,
        artifactFilter, artifactCollector );
String dependencyTreeString = serializeDependencyTree( rootNode );
DependencyUtil.log( dependencyTreeString, getLog() );

那就是你在寻找的东西吗?

那正是我正在寻找的。非常感谢。不幸的是,看起来他们没有将该方法通用化以适用于任何树模型(实际上我想做的是创建一个指定jar文件的调用图)。我得进行一些复制粘贴编程 :( - Sridhar Sarnobat
http://maven.apache.org/plugins/maven-dependency-plugin/xref/org/apache/maven/plugin/dependency/TreeMojo.html - Sridhar Sarnobat
很高兴听到它有所帮助,祝你好运! - rlegendi

1

如果有人来到这里寻找纯Java库的解决方案 - 这里有 text-tree

<dependency>
  <groupId>org.barfuin.texttree</groupId>
  <artifactId>text-tree</artifactId>
  <version>2.0.0</version>
</dependency>

您只需让树节点实现Node接口,然后就可以

Node tree = ...;   // your tree
TreeOptions options = new TreeOptions();
options.setStyle(new TreeStyle("+- ", "|  ", "\\- "));
String rendered = TextTree.newInstance(options).render(tree);
System.out.println(rendered);

该代码生成与您示例相同的树形结构。此代码使用自定义树形样式以匹配您的示例,但预定义的树形样式存在。
完整披露:我是text-tree的作者。它是免费且开源的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接