16. května 2010

Generování class diagramů - Maven plugin

Na konci minulého roku jsem psal o programovém generování class diagramů.

Dnes bych na tento článek navázal implementací Maven pluginu. Ve firmě jsme kompletně přešli na Maven, takže jsem byl nucen vhodně přepsat původní ANT skript.

Implementace byla jednoduchá, napsal jsem totiž Maven plugin pomocí ANTu (pozor, nemyslím využití Maven Ant pluginu).

Dále přikládám zdrojové kódy, které asi nepotřebují další komentáře:

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cz.marbes.plugins</groupId>
<artifactId>daisy-maven-plugins</artifactId>
<version>3.12.0.11-SNAPSHOT</version>
</parent>
<groupId>cz.marbes.plugins</groupId>
<artifactId>generator-diagram-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>3.12.0.11-SNAPSHOT</version>
<name>generator-diagram-plugin Maven Mojo</name>
<description>Plugin na generovani class diagramu</description>


<build>
<plugins>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>2.3</version>

<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-tools-ant</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>

<configuration>
<goalPrefix>diagram</goalPrefix>
</configuration>
</plugin>
</plugins>
</build>


<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-script-ant</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.umlgraph</groupId>
<artifactId>doclet</artifactId>
<version>5.1</version>
</dependency>
<!-- Knihovna UmlGraph vyzaduje, aby byl vedle ni umisten tools.jar -->
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
<!--<systemPath>${user.home}/.m2/repository/org/umlgraph/doclet/5.1/tools.jar</systemPath>-->
</dependency>
</dependencies>

</project>


diagram.build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="generator-diagram-plugin">
<target name="generate">
<!-- vytvoreni vystupniho adresare -->
<mkdir dir="${outputDir}"/>
<delete dir="${outputDir}"/>
<mkdir dir="${outputDir}"/>

<!-- generovani class diagramu -->
<java classname="cz.marbes.plugins.maven.generator.diagram.ClassDiagramGenerator">
<arg value="${package}"/>
<arg value="${outputDir}"/>
<arg value="${srcDir}"/>
<arg value="${dotFile}"/>
</java>
</target>
</project>


diagram.mojos.xml:

<?xml version="1.0" encoding="UTF-8"?>
<pluginMetadata>
<mojos>
<mojo>
<goal>generate</goal>

<!-- this element refers to the Ant target we'll invoke -->
<call>generate</call>

<requiresProject>true</requiresProject>

<description>
Plugin na generovani class diagramu.

Plugin vyzaduje (bohuzel) dve nutna zla:
- musi byt lokalne nainstalovay Graphiz (http://www.graphviz.org). Cesta k '
dot' souboru se zadava pres property 'dotFile'
- knihovna tools.jar musi byt vedle knihovny UmlGraph v Maven repository
</description>
<parameters>
<parameter>
<name>outputDir</name>
<property>outputDir</property>
<required>true</required>
<readonly>true</readonly>
<expression>${outputDir}</expression>
<defaultValue>${project.build.directory}/diagram_output</defaultValue>
<type>java.lang.String</type>
<description>Cesta k vystupnimu adresari, do ktereho se bude generovat diagram.</description>
</parameter>
<parameter>
<name>srcDir</name>
<property>srcDir</property>
<required>true</required>
<readonly>true</readonly>
<expression>${srcDir}</expression>
<defaultValue>${project.build.sourceDirectory}</defaultValue>
<type>java.lang.String</type>
<description>Absolutni cesta k adresari projektu se zdrojovymi soubory, kde je zadany package,
napr. '
/Volumes/Obelix/projects/daisy/apl/aa/trunk/aa-core/src/main/java'.
</description>
</parameter>
<parameter>
<name>package</name>
<property>package</property>
<required>true</required>
<expression>${package}</expression>
<type>java.lang.String</type>
<description>Package, pro ktery se ma generovat class diagram,
napr. '
cz.marbes.daisy.modules.aa.wscommon.komu.v1_1_2'.
</description>
</parameter>
<parameter>
<name>dotFile</name>
<property>dotFile</property>
<required>true</required>
<expression>${dotFile}</expression>
<type>java.lang.String</type>
<description>Cesta ke graphviz DOT souboru (napr. '
/usr/local/bin/dot')</description>
</parameter>
</parameters>
</mojo>
</mojos>
</pluginMetadata>


Nakonec ještě přikládám použití pluginu:

<profile>
<id>generate-diagram</id>
<!--
Profil vyzaduje dve nutna zla:
- musi byt lokalne nainstalovay Graphiz. Cesta k 'dot' souboru se zadava pres property 'dotFile'
- knihovna tools.jar musi byt vedle knihovny UmlGraph v Maven repozitory

Priklad:
mvn process-classes -Pgenerate-diagram -DdotFile=/usr/local/bin/dot -Dpackage=cz.marbes.daisy.modules.aa.modules.pvs.ws.v2_0_0
-->
<build>
<plugins>
<plugin>
<groupId>cz.marbes.plugins</groupId>
<artifactId>generator-diagram-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>process-classes</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${user.home}/.m2/repository/org/umlgraph/doclet/5.1/tools.jar</systemPath>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>


Stejně jako původní řešení, tak i Maven plugin má své omezení, ale pro interní použití se to dá překonat. Důležité je, že dokážeme generovat pěkné class diagramy k našemu kódu. Class diagramy dáváme zejména do dokumentace k našim webovým službám, protože to zvyšuje jejich čitelnost a použitelnost.

Žádné komentáře: