Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tool to generate graph data for class dependencies [closed]

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,...).

like image 783
Rostislav Matl Avatar asked Nov 06 '13 08:11

Rostislav Matl


People also ask

What is a data dependency graph?

A dependency graph is a data structure formed by a directed graph that describes the dependency of an entity in the system on the other entities of the same system. The underlying structure of a dependency graph is a directed graph where each node points to the node on which it depends.

What is a dependency graph Webpack?

Any time one file depends on another, webpack treats this as a dependency. This allows webpack to take non-code assets, such as images or web fonts, and also provide them as dependencies for your application.


1 Answers

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.

like image 150
Jason Lowenthal Avatar answered Sep 28 '22 12:09

Jason Lowenthal