日暮途远

日暮途远,涸辙难行;东隅已逝,桑榆非晚

是时候使用 plantuml 了

这几天在写技术相关文档的时候,用 plantuml 画了不少的系统架构图,时序图等 UML 相关的图,小伙伴们看到图后都觉得还挺美观的,都以为是专业的 UML 软件(如 rational rose, astah)制作的,其实不然,今天给大家推荐另一种画 UML 图的工具,一种更简洁,更自然,更高效,更程序员化的工具:PlantUML。

严格来说,PlantUML 并不是一种工具,而是一种语言级别的建模规范,是一直直观的脚本语言,用来描述 UML 组件及其关系,再通过特有的渲染方式,来生成美观的 UML 图像(甚至渲染成 ascii 格式的字符图形),渲染引擎采用的是大名鼎鼎的 graphviz

它可以快速画出以下UML图:
– 时序图
– 用例图
– 类图
– 活动图
– 组件图
– 状态图
– 流程图
– 对象图
– 部署图
– 实时图

同时,还支持如下非UML图
– Wireframe graphical interface
– Archimate diagram
– Specification and Description Language (SDL)
– Ditaa diagram
– Gantt diagram
– Mathematic with AsciiMath or JLaTeXMath notation

具体的内容可以参见其官网:PlantUML,其各种不同图的语法和示例在官网上有很详细的介绍,网上也能搜索到许多的教程资料。同时,各个 IDE 也都能完善的支持其文本 -> 图片的渲染,同时,其官方也提供了一个在线的渲染器plant uml online server,可以将写好的 plantuml 文本提交生成对象的 UML 图。


这里不作详细的介绍,作为程序猿,本文主要讲解一下,如何通过 API 来自己生成 UML 图,这一高级特性。这样可以自己动手写一个服务来渲染,或者在公司内部提供一个 plantuml 渲染服务,从公司内部的 SVN, GIT 等 CVS 服务器上直接拉取代码进行 UML 图的渲染。

库安装
前文说过,PlantUML 采用了 graphviz 作为底层的渲染库,所以需要先安装  graphviz 库,可以在其官方网站下载。

依赖
plantuml 的 API 依赖非常简单,已经有开源的实现,只需要在项目工程中加入如下的 MAVEN 依赖即可:

它是一个独立的第三方库,并不需要再依赖其它的库,只需要这一个库即可完成 PlantUML 图的渲染,渲染 API 也是非常的简单,如下所示:

这是一个基于 SpringBoot 的应用,真正起到渲染作用的是下面这 2 行:

没错,就只 2 行代码,一行设置输入文本,一行渲染到输出流,是不是很简单。当然,可以在此基础上,将输入流桥接到其它的地方,比如之前说到的,从公司的代码库获取,或者从  github 上获取等。


其直观的语法,简洁快速的渲染,实时可视化的编辑方式成为我一直以来画 UML 图的首选。比起那些动辄几百兆,License 几百块的商业软件来说,这款小巧灵动开源的开箱即用的脚本简直是神器,更重要的是:完全支持 CVS完全支持 CVS完全支持 CVS(重要的事情说3遍) ,其所有的内容全部由文本写就,对 CVS 有与生俱来的支持性。相反,那些大型的商业软件生成的UML结果一般都是二进制文件,且只有自己能解析识别,CVS 对其束手无策,版本控制起来简直就是灾难。

下面是最近刚刚使用 PlantUML 编写的 UML 文本与生成的图片,大家可以直观的了解一下是多么的便捷:

plant_demo_1

图一:组件图

plant_demo_2

图二:时序图

plant_demo_3

图三:类图

plant_demo_4

图四:用例图

点赞
  1. This piece of writing will help the iinternet visitors for creating
    new weblog or even a blog from start to end.

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">