Инструмент для генерации данных графа для зависимостей классов

Есть ли какой-нибудь инструмент, способный анализировать исходные файлы Java, построить из него график и предоставить данные графа в некотором стандартном/понятном формате?

Определенно не нужно иметь графический интерфейс, я бы предпочел задачу командной строки, поэтому я могу обрабатывать выходные данные различными инструментами (для сегментации, визуализации,...).

Ответ 1

Я не уверен насчет инструментов командной строки, но мне нравится использовать ObjectAid для обратного инжиниринга в диаграммы классов:

http://www.objectaid.com/

Вы можете легко добавить любой класс с его отношениями в граф ObjectAid. Сохраняет файл в формате XML с расширением ucls. Вот образец:

<?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, извините, что я не знаю больше ни о каких инструментах командной строки, которые могли бы выполнять то, что вы просите.

Ответ 3

Вы можете UMLGraph использовать. Он использует GraphViz/dot, как и большинство таких графических инструментов. Я не использовал его, поэтому я не могу его пересмотреть.

Сказав это, вы также сможете свернуть собственный минималистический инструмент диаграмм, используя GraphViz и dot.

Я использовал GraphViz/dot для создания множества полезных типов диаграмм, от визуализации контекстов Spring до зависимостей модулей IntelliJ, до визуализации сложных XML-документов. Посмотрите вокруг и посмотрите, что вы найдете.

Ответ 4

От http://blog.schauderhaft.de/degraph/:

Вы можете анализировать файлы классов и банки с помощью Degraph и получать в результате графический файл. Это можно сделать с помощью yed.

Ответ 6

Если вопрос все еще актуальный, попробуйте использовать плагин Code Iris. Он работает с Intellij Idea http://plugins.jetbrains.com/plugin/7324

Он обеспечивает визуальное отображение графика зависимостей на уровне классов, пакетов и модулей. Кроме того, вы можете экспортировать данные в формат json.

Он по-прежнему обновляется и свободен.

Ответ 7

Я только что создал минимальный инструмент, который анализирует и отображает график зависимостей между пакетами, без большого взаимодействия или для других программ.

https://github.com/battlesnake/jorgy

Это совершенно недокументировано, так как это быстрый проект взлома, но в основном вы его запускаете и передаете путь к исходной директории в качестве первого аргумента.

Он не заботится о именах каталогов или именах файлов, но требует:

  • объявление package в каждом файле.

  • Точно один тип, определенный на верхнем уровне (нулевые или многие внутренние типы, вложенные в него, являются точными).

Вы можете изменить интерфейс GraphStyle в классе Application в соответствии с вашими потребностями. Этот интерфейс дает вам возможность рассказать строителю графа, какие зависимости слабы, которые не должны отображаться на графике и т.д.

Ответ 9

Попробуйте Google CodePro Analytix. инструмент дает хорошее представление о dependencies.

Однако я не пробовал использовать его с точки зрения командной строки. Я ожидаю, что он будет поддерживать экспорт отчетов, который можно проанализировать дальше по цепочке инструментов.