是否有一些工具能够分析 Java 源文件,从中构建图形并以某种标准/可理解的格式提供图形数据?
它绝对不需要 GUI,我更喜欢命令行的东西,这样我就可以通过各种工具(用于分割、可视化等)处理输出。
是否有一些工具能够分析 Java 源文件,从中构建图形并以某种标准/可理解的格式提供图形数据?
它绝对不需要 GUI,我更喜欢命令行的东西,这样我就可以通过各种工具(用于分割、可视化等)处理输出。
我不确定命令行工具,但我喜欢使用 ObjectAid 对类图进行逆向工程:
您可以轻松地将任何类及其关系添加到 ObjectAid 图表中。它以带有 ucls 扩展名的 XML 格式保存文件。这是一个示例:
<?xml version="1.0" encoding="UTF-8"?>
<class-diagram version="1.1.4" icons="true"
always-add-relationships="true" generalizations="true" realizations="true"
associations="true" dependencies="true" nesting-relationships="true">
<class id="1" language="java"
name="my.classpath.common.controllers.AuthenticationInterceptor"
project="MyProject"
file="/SpecialPath/common/controllers/AuthenticationInterceptor.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="205" width="355" x="2222" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="2" language="java"
name="my.classpath.common.domain.CompanyAssignmentLocation" project="MyProject"
file="/SpecialPath/common/domain/CompanyAssignmentLocation.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="-1" width="-1" x="856" y="399" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="3" language="java"
name="my.classpath.common.domain.LocationsSpreadsheetReader" project="MyProject"
file="/SpecialPath/common/domain/LocationsSpreadsheetReader.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="115" width="348" x="680" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="4" language="java" name="my.classpath.common.domain.Stock"
project="MyProject" file="/SpecialPath/common/domain/Stock.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="439" width="210" x="430" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="5" language="java" name="my.classpath.common.util.FilesUtil"
project="MyProject" file="/SpecialPath/common/util/FilesUtil.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="277" width="218" x="1409" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="6" language="java" name="my.classpath.common.util.MyProjectUtil"
project="MyProject" file="/SpecialPath/common/util/MyProjectUtil.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="439" width="349" x="41" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="7" language="java" name="my.classpath.common.util.SpringUtil"
project="MyProject" file="/SpecialPath/common/util/SpringUtil.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="133" width="246" x="1936" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="8" language="java"
name="my.classpath.common.util.MyProjectUserUtil" project="MyProject"
file="/SpecialPath/common/util/MyProjectUserUtil.java" binary="false"
corner="BOTTOM_RIGHT">
<position height="133" width="229" x="1667" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<class id="9" language="java" name="my.classpath.common.util.UnitConversion"
project="MyProject" file="/SpecialPath/common/util/UnitConversion.java"
binary="false" corner="BOTTOM_RIGHT">
<position height="151" width="301" x="1068" y="37" />
<display autosize="true" stereotype="true" package="true"
initial-value="false" signature="true" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</display>
</class>
<dependency id="10">
<end type="SOURCE" refId="3" />
<end type="TARGET" refId="2" />
</dependency>
<classifier-display autosize="true" stereotype="true"
package="true" initial-value="false" signature="true" accessors="true"
visibility="true">
<attributes public="true" package="true" protected="true"
private="true" static="true" />
<operations public="true" package="true" protected="true"
private="true" static="true" />
</classifier-display>
<association-display labels="true" multiplicity="true" />
</class-diagram>
您也可以使用 PlantUML,但它更适合正向工程而不是逆向工程:
http://plantuml.sourceforge.net/
PlantUML 有自己独特的语法,您也可以获取源代码 - 但它不像 ObjectAid 那样容易整合
这两个都作为 eclipse 插件工作,很抱歉,我不知道更多关于可能能够完成您所要求的任何命令行工具的信息。
至于命令行工具,您可能想看看jdeps
:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html
jdeps -cp <your cp> -v <path to your .class file>
这是类依赖分析器(CDA)。
此工具的目的是分析 Java™ 类文件,以了解有关这些类之间的依赖关系的更多信息。
这里是 API: http: //www.dependency-analyzer.org/#PluginAPI
来自http://blog.schauderhaft.de/degraph/:
您可以使用 Degraph 分析类文件和 jar,并获得一个 graphml 文件作为结果。这可以使用 yed 来呈现。
你可能对 UMLGraph有用。它像大多数此类图形工具一样利用 GraphViz/dot。但是,我没有使用过它,因此无法对其进行评论。
话虽如此,您也可以仅使用 GraphViz 和 dot 来推出自己的简约图表工具。
我使用 GraphViz/dot 生成了许多有用的图表类型,从 Spring 上下文的可视化到 IntelliJ 模块依赖项,再到复杂 XML 文档的可视化。环顾四周,看看你发现了什么。
我在我的 IDE 中使用这个功能 - IntelliJ Idea
有关更多信息和屏幕截图,请参阅此页面http://www.jetbrains.com/idea/features/uml_class_diagram.html
试试Google CodePro Analytix。该工具提供了有关依赖关系的良好洞察力。
但是我还没有尝试从命令行的角度使用它。我希望它支持报告导出,可以在工具链中进一步解析。
我刚刚创建了一个最小的工具,它可以分析和显示包之间的依赖关系图,无需太多交互或需要其他程序。
https://github.com/battlesnake/jorgy
它没有文档记录,因为它是一个快速的 hack 项目,但基本上你运行它并将源目录的路径作为第一个参数传递给它。
它不关心目录名或文件名,但确实需要:
package
每个文件中的声明。
正是在顶层定义的一种类型(嵌套在其中的零个或多个内部类型都可以)。
您可以更改类中的GraphStyle
界面Application
以满足您的需要。这个接口提供了一种方法让你告诉图形构建器哪些依赖是弱的,哪些不应该显示在图形上,等等。
如果问题仍然存在,请尝试使用 Code Iris 插件。它适用于 Intellij Idea http://plugins.jetbrains.com/plugin/7324
它提供了类、包和模块级别的依赖图的可视化表示。此外,您可以将数据导出为 json 格式。
它仍然是更新和免费的。