Existe-t-il un outil capable d'analyser Java, d'en construire un graphique et de fournir les données du graphique dans un format standard/compréhensible?
Il n'a définitivement pas besoin de GUI, je préfère une chose en ligne de commande pour pouvoir traiter la sortie par divers outils (pour la segmentation, la visualisation, ...).
Je ne suis pas certain des outils de ligne de commande, mais j'aime utiliser ObjectAid pour l'ingénierie inverse dans les diagrammes de classes:
Vous pouvez facilement ajouter n'importe quelle classe avec ses relations à un graphique ObjectAid. Il enregistre le fichier au format XML avec l'extension ucls. Voici un exemple:
<?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>
Vous pouvez également utiliser PlantUML, mais c'est mieux pour l'ingénierie avancée que l'ingénierie inverse:
http://plantuml.sourceforge.net/
PlantUML a sa propre syntaxe unique pour laquelle vous pouvez également obtenir la source - mais ce n'est pas aussi facile à rassembler qu'ObjectAid
Ces deux fonctionnent comme des plug-ins Eclipse, désolé de ne pas en savoir plus sur les outils de ligne de commande qui pourraient faire ce que vous demandez.
Voici Class Dependency Analyzer (CDA) .
Le but de cet outil est d'analyser les fichiers de classe Java ™ afin d'en savoir plus sur les dépendances entre ces classes.
Et voici l'API: http://www.dependency-analyzer.org/#PluginAPI
Vous pourriez MLGraph utile. Il utilise GraphViz/dot comme la plupart de ces outils graphiques. Je ne l'ai pas utilisé, je ne peux donc pas en donner une critique.
Cela étant dit, vous pourriez également être en mesure de lancer votre propre outil de création de diagrammes minimaliste en utilisant simplement GraphViz et dot.
J'ai utilisé GraphViz/dot pour générer de nombreux types de diagrammes utiles, des visualisations des contextes Spring aux dépendances du module IntelliJ, en passant par les visualisations de documents XML complexes. Regardez autour de vous et voyez ce que vous trouvez.
De http://blog.schauderhaft.de/degraph/ :
Vous pouvez analyser les fichiers de classe et les pots à l'aide de Degraph et obtenir un fichier graphml en conséquence. Cela peut être rendu en utilisant yed.
Je viens de créer un outil minimal qui analyse et affiche un graphique des dépendances entre les packages, sans trop d'interaction ou nécessitant d'autres programmes.
https://github.com/battlesnake/jorgy
C'est assez non documenté car c'est un projet de piratage rapide, mais en gros vous l'exécutez et passez le chemin vers votre répertoire source comme premier argument.
Il ne se soucie pas des noms de répertoire ou des noms de fichiers, mais nécessite:
package
déclaration dans chaque fichier.
Exactement un type défini au niveau supérieur (zéro ou plusieurs types internes imbriqués qui conviennent).
Vous pouvez modifier l'interface GraphStyle
dans la classe Application
selon vos besoins. Cette interface vous permet de dire au générateur de graphiques quelles dépendances sont faibles, qui ne devraient pas être affichées sur le graphique, etc.
Si la question est toujours d'actualité, essayez d'utiliser le plugin Code Iris. Cela fonctionne avec Intellij Idea http://plugins.jetbrains.com/plugin/7324
Il fournit une représentation visuelle du graphique de dépendance au niveau des classes, des packages et des modules. De plus, vous pouvez exporter des données au format json.
Il est toujours mis à jour et gratuit.
Quant à un outil en ligne de commande, vous voudrez peut-être jeter un œil à jdeps
:
https://docs.Oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html
jdeps -cp <your cp> -v <path to your .class file>
J'utilise cette fonctionnalité dans mon IDE - Idée IntelliJ
Voir cette page pour plus d'informations et de captures d'écran http://www.jetbrains.com/idea/features/uml_class_diagram.html
Essayez Google CodePro Analytix . l'outil fournit un bon aperçu de dépendances .
Cependant, je n'ai pas essayé de l'utiliser du point de vue de la ligne de commande. Je m'attends à ce qu'il prenne en charge l'exportation de rapports, qui peut être analysée plus loin dans la chaîne d'outils.