java - pasos - swing containers
Herramienta para generar datos gráficos para dependencias de clase (9)
¿Existe alguna herramienta que pueda analizar los archivos fuente de Java , construir un gráfico a partir de él y proporcionar los datos del gráfico en algún formato estándar / comprensible ?
Definitivamente no es necesario tener GUI, prefiero una cosa de línea de comandos para poder procesar la salida mediante varias herramientas (para segmentación, visualización, ...).
Acabo de crear una herramienta mínima que analiza y muestra un gráfico de dependencias entre paquetes, sin mucha interacción ni necesidad de otros programas.
https://github.com/battlesnake/jorgy
Es bastante indocumentado ya que es un proyecto de pirateo rápido, pero básicamente lo ejecutas y pasas la ruta a tu directorio de origen como el primer argumento.
No importa los nombres de directorio o los nombres de archivo, pero requiere:
Declaración de
package
en cada archivo.Exactamente un tipo definido en el nivel superior (cero o muchos tipos internos anidados dentro de eso están bien).
Puede alterar la interfaz GraphStyle
en la clase de Application
para que se adapte a sus necesidades. Esta interfaz le proporciona una manera de decirle al generador de gráficos qué dependencias son débiles, que no se deben mostrar en el gráfico, etc.
Aquí está el analizador de dependencia de clase (CDA) .
El propósito de esta herramienta es analizar los archivos de clase de Java ™ para aprender más sobre las dependencias entre esas clases.
Y aquí está la API: http://www.dependency-analyzer.org/#PluginAPI
De http://blog.schauderhaft.de/degraph/ :
Puede analizar los archivos de clase y los archivos jar utilizando Degraph y obtener un archivo graphml como resultado. Esto puede ser renderizado usando yed.
En cuanto a una herramienta de línea de comandos, es posible que desee echar un vistazo a jdeps
:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html
jdeps -cp <your cp> -v <path to your .class file>
Es posible que UMLGraph sea útil. Aprovecha GraphViz / dot al igual que la mayoría de estas herramientas gráficas. Sin embargo, no lo he usado, así que no puedo dar una reseña.
Dicho esto, también puedes rodar tu propia herramienta de diagramación minimalista utilizando GraphViz y dot.
He utilizado GraphViz / dot para generar muchos tipos útiles de diagramas, desde visualizaciones de contextos Spring a dependencias de módulos IntelliJ, hasta visualizaciones de documentos XML complejos. Mira a tu alrededor y ve lo que encuentres.
No estoy seguro de las herramientas de línea de comandos, pero me gusta usar ObjectAid para ingeniería inversa en diagramas de clase:
Puede agregar fácilmente cualquier clase con sus relaciones a un gráfico de ObjectAid. Guarda el archivo en formato XML con la extensión ucls. Aquí hay una muestra:
<?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>
También puede usar PlantUML, pero es mejor para ingeniería avanzada que para ingeniería inversa:
http://plantuml.sourceforge.net/
PlantUML tiene su propia sintaxis única para la que también puede obtener una fuente, pero no es tan fácil de juntar como ObjectAid
Ambos funcionan como complementos de eclipse, lamento no saber más sobre las herramientas de la línea de comandos que podrían hacer lo que estás pidiendo.
Pruebe Google CodePro Analytix . La herramienta proporciona una buena visión sobre las dependencies .
Sin embargo, no he intentado usarlo desde una perspectiva de línea de comandos. Espero que sea compatible con la exportación de informes, que puede analizarse más abajo en la cadena de herramientas.
Si la pregunta sigue siendo real, intente usar el complemento Code Iris. Funciona con Intellij Idea http://plugins.jetbrains.com/plugin/7324
Proporciona una representación visual del gráfico de dependencia a nivel de clases, paquetes y módulos. Además, puedes exportar datos a formato json.
Todavía está actualizado y gratis.
Utilizo esta funcionalidad en mi IDE - IntelliJ Idea
Consulte esta página para obtener más información y capturas de pantalla http://www.jetbrains.com/idea/features/uml_class_diagram.html