tool to generate graph data for class dependencies [closed]

六月ゝ 毕业季﹏ 提交于 2019-12-18 10:51:14

问题


Is there some tool that is able to analyze Java source files, construct a graph from it and provide the graph's data in some standard / understandable format ?

It definitively does not need to have GUI, I'd prefer a command line thing so I can process the output by various tools (for segmentation, visualization,...).


回答1:


I'm not certain about command line tools, but I like using ObjectAid for reverse engineering into class diagrams:

http://www.objectaid.com/

You can easily add any class with it's relationships to an ObjectAid graph. It saves the file in an XML format with the ucls extension. Here's a sample:

<?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>

You can also use PlantUML, but it's better for forward engineering than reverse engineering:

http://plantuml.sourceforge.net/

PlantUML has its own unique syntax that you can get source for, too - but it's not nearly as easy to pull together as ObjectAid

Both of these work as eclipse plug-ins, sorry that I don't know more about any command line tools that might be able to do what you're asking.




回答2:


Here is Class Dependency Analyzer (CDA) .

The purpose of this tool is to analyze Java™ class files in order to learn more about the dependencies between those classes.

And here is the API:http://www.dependency-analyzer.org/#PluginAPI




回答3:


You might UMLGraph useful. It leverages GraphViz/dot as do most such graphing tools. I haven't used it, so I can't give a review of it, however.

That being said, you might also be able to roll your own minimalistic diagramming tool just using GraphViz and dot.

I've used GraphViz/dot to generate many useful types of diagrams, from visualizations of Spring contexts to IntelliJ module dependencies, to visualizations of complex XML documents. Look around and see what you find.




回答4:


From http://blog.schauderhaft.de/degraph/:

You can analyse class files and jars using Degraph and get a graphml file as result. This can be rendered using yed.




回答5:


I'm use this functionality in my IDE - IntelliJ Idea

See this page for more information and screenshots http://www.jetbrains.com/idea/features/uml_class_diagram.html




回答6:


If the question is still actual, try using the Code Iris plugin. It works with Intellij Idea http://plugins.jetbrains.com/plugin/7324

It provides visual representation of dependency graph on classes, packages and modules level. Moreover, you can export data into json format.

It is still updated and free.




回答7:


I just created a minimal tool which analyses and displays a graph of dependencies between packages, without much interaction or requiring other programs.

https://github.com/battlesnake/jorgy

It's quite undocumented as it's a quick hack project, but basically you run it and pass the path to your source directory as the first argument to it.

It doesn't care about directory names or file names, but does require:

  • package declaration in each file.

  • Exactly one type defined at the top-level (zero or many inner types nested within that are fine).

You can alter the GraphStyle interface in the Application class to suit your needs. This interface provides a way for you to tell the graph builder which dependencies are weak, which should not be shown on the graph, etc.




回答8:


As for a command line tool, you may want to take a look at jdeps:

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

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



回答9:


Try Google CodePro Analytix. the tool provides good insight about dependencies.

However I haven't tried using it from a command-line perspective. I expect it to support reports export, which can be parsed further down the tool-chain.



来源:https://stackoverflow.com/questions/19807372/tool-to-generate-graph-data-for-class-dependencies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!