用于生成类依赖关系的图形数据的工具

时间:2013-11-06 08:40:59

标签: java dependencies static-analysis

是否有一些工具可以分析Java源文件,从中构建图表并以某种标准/可理解的格式提供图表数据

它最终不需要GUI,我更喜欢命令行,所以我可以通过各种工具处理输出(用于分段,可视化......)。

9 个答案:

答案 0 :(得分:8)

我不确定命令行工具,但我喜欢使用ObjectAid进行类图的逆向工程:

http://www.objectaid.com/

您可以轻松地将任何类与其关系添加到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插件工作,很抱歉我不太了解任何可能能够做你所要求的命令行工具。

答案 1 :(得分:5)

这是Class Dependency Analyzer (CDA)

  

此工具的目的是分析Java™类文件   详细了解这些类之间的依赖关系。

以下是API:http://www.dependency-analyzer.org/#PluginAPI

答案 2 :(得分:2)

您可能UMLGraph有用。它像大多数此类图形工具一样利用GraphViz / dot。我没有用它,所以我不能对它进行评论。

话虽如此,您也可以使用GraphViz和dot滚动自己的简约图表工具。

我使用GraphViz / dot生成许多有用的图表类型,从Spring上下文的可视化到IntelliJ模块依赖,再到复杂XML文档的可视化。环顾四周,看看你找到了什么。

答案 3 :(得分:2)

来自http://blog.schauderhaft.de/degraph/

  

您可以使用Degraph分析类文件和jar,并获取graphml文件作为结果。这可以使用yed呈现。

答案 4 :(得分:1)

我在IDE中使用此功能 - IntelliJ Idea

有关详细信息和屏幕截图http://www.jetbrains.com/idea/features/uml_class_diagram.html

,请参阅此页面

答案 5 :(得分:1)

如果问题仍然存在,请尝试使用Code Iris插件。它适用于Intellij Idea http://plugins.jetbrains.com/plugin/7324

它提供了对类,包和模块级别的依赖图的可视化表示。此外,您可以将数据导出为json格式。

它仍然更新且免费。

答案 6 :(得分:1)

我刚创建了一个最小的工具,可以分析并显示包之间的依赖关系图,无需太多交互或需要其他程序。

https://github.com/battlesnake/jorgy

它完全没有文档,因为它是一个快速的黑客项目,但基本上你运行它并将路径作为第一个参数传递给你的源目录。

它不关心目录名称或文件名,但确实需要:

  • package声明每个文件。

  • 在顶级定义的一种类型(嵌套在其中的零或许多内部类型都很好)。

您可以更改GraphStyle课程中的Application界面以满足您的需求。此界面为您提供了一种方法,可以告诉图形构建器哪些依赖项很弱,哪些不应该显示在图表上等。

答案 7 :(得分:1)

对于命令行工具,您可能需要查看jdeps

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html

jdeps -cp <your cp> -v <path to your .class file>

答案 8 :(得分:0)

试试Google CodePro Analytix。该工具提供了有关dependencies的良好见解。

但是我没有尝试从命令行角度使用它。我希望它能够支持报告导出,可以在工具链中进一步解析。