用UmlGraph在Javadoc中嵌入UML图表

最近在看《Java Power Tools》,对UmlGraph很感兴趣,于是小研究了下。

 

UmlGraph可以将由源代码生成的UML图表(这里就是类图)嵌入在javadoc中,这样的好处就是不需要人工维护,每次都是从源代码自动生成。

 

以下就是一个使用UmlGraph在javadoc生成UML图表的效果图:

 

在图表上点击相应的类图,则会跳转到对应类的页面,真的很好很强大。

 

那么,该如何使用UmlGraph呢?

一。下载与安装

UmlGraph官方网站:http://www.umlgraph.org/

现在下载的最新版本为:5.4

下载后解压到任意目录即可,比如:E:/UMLGraph-5.4。

 

另外,要想使用UmlGraph,还需要安装Graphviz。

 

Graphviz官网地址:http://www.graphviz.org/

 

在windows下安装Graphviz比较简单,下载到graphviz-2.26.3.msi(目前的最新版本),双击,一步步安装就行。

 

在linux下安装Graphviz稍显复杂,具体的安装步骤请参看:linux下graphviz的安装

 

二。ant配置

的在ant中使用UmlGraph很方便,只需要在<javadoc>任务中嵌入<doclet>标签,并使用<param>标签指定参数,以下是一个示例:

<!-- 生成javadoc -->
	<target name="javadoc" depends="compile" description="javadoc run">
		<echo message="javadoc run" />
		<delete dir="${reports.javadoc.dir}" />
		<mkdir dir="${reports.javadoc.dir}" />
		<javadoc sourcepath="${src.dir}" destdir="${reports.javadoc.dir}" encoding="UTF-8" charset="UTF-8" docencoding="UTF-8" author="true" version="true" use="true" access="private" linksource="true" windowtitle="${ant.project.name} API">
			<classpath>
				<path refid="compile.classpath" />
				<pathelement path="${compile.classes.dir}" />
			</classpath>
			<doctitle>
				<![CDATA[<H1>${ant.project.name}</H1>]]></doctitle>
		<bottom>
			<![CDATA[<i>Copyright &#169; 2010  All Rights Reseverd.</i>]]></bottom>

	<doclet name="org.umlgraph.doclet.UmlGraphDoc" path="E:/UMLGraph-5.4/UmlGraph.jar">
		
		<param name="-inferrel" />
		<param name="-inferdep" />
		<!-- 不显示详细日志信息,出问题时可以注释掉 -->		
                <param name="-quiet" />
		
		<param name="-hide" value="java.*" />
		<param name="-collpackages" value="java.util.*" />
		<param name="-postfixpackage" />
		<param name="-nodefontsize" value="9" />
		<param name="-nodefontpackagesize" value="7" />	
		<param name="-qualify" />
		<param name="-attributes" />
		<param name="-operations" />
		<param name="-enumerations" />
		<param name="-enumconstants" />
                <!-- 检索生成的html页面时使用的编码,默认为ISO-8859-1,
                  在向页面中插入图表时需要进行正则匹配,如果要匹配中文需要将其设置为UTF-8
		<param name="-outputencoding" value="UTF-8" />
                -->
		<param name="-types" />
		<param name="-visibility" />

                <!-- 提供外部javadoc地址,可以直接导航过去 -->
		<param name="-link" value="http://download.oracle.com/javaee/6/api/" />
		<param name="-link" value="http://static.springsource.org/spring/docs/2.5.x/api/" />
		<param name="-link" value="http://docs.jboss.org/hibernate/core/3.6/javadocs/" />
		<param name="-link" value="http://logging.apache.org/log4j/1.2/apidocs/" />
	</doclet>

</javadoc>
<echo message="javadoc completed!" />
</target>

 以上<param>配置的比较完整了,可以在javadoc中嵌入一个相当完整和详细的UML图表。

 

三。问题

使用过程中发现这样的问题,就是用ant生成javadoc时,只能在package页中嵌入UNL图表,而每一个具体的类页面中却不能实现嵌入,这是为什么呢?

 

于是乎,注释掉quiet参数查看详细日志

<!-- 是否显示详细日志信息,出问题时可以打开进行查看 
		<param name="-quiet" />
	-->	

结果发现,日志打印如下信息

[javadoc] Warning, could not find a line that matches the pattern '(Class|Interface|Enum) MultipartFileValidator.*'.
[javadoc]  Class diagram reference not inserted

 

 

意思是没有成功进行正则匹配,导致图表没有插入。这就比较奇怪,为什么插入包图表时没有问题呢?

 

ok,还是看下源码吧,问题出在org.umlgraph.doclet.UmlGraphDoc中。

图表插入包中的正则匹配规则是

Pattern.compile("</H2>")

 而图表插入类中的匹配规则是

Pattern.compile("(Class|Interface|Enum) " + classDoc.name() +".*")

 

因为javadoc是使用UTF-8编码生成的,所以在html页面中“Class”变成了“类”,所以匹配不上。

 

清楚了这一点后对源码做了如下修改:

方法一:

Pattern.compile("(Class|Interface|Enum|类|接口|枚举) " + classDoc.name() +".*")

 不过这时doclet中的参数outputencoding要设置为UTF-8:

<param name="-outputencoding" value="UTF-8" />

 方法二:

Pattern.compile(".*" + classDoc.name() +"</H2>.*")

 这与包匹配规则类似,不过确实很好用,推荐使用第二种方式进行修改。

 

ok,重新编译,打jar包,附件中为使用第二种方式打的jar包。

 

补充说明一下:编译UmlGraph需要用到JAVA_HOME/lib下的tools.jar。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值