转载自:https://cloud.tencent.com/developer/article/1010617

1、PlantUML介绍

UML 统一建模语言是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。PlantUML 是一个开源项目,支持快速绘制时序图、流程图、活动图、状态图、用例图、类图等等,开发人员通过简单直观的语言来定义这些示意图。以前我们要绘制以上各图时,一般我们使用可视化工具 visio , rose 等工具,会经常为了布局文字排版,搞的焦头烂额,有了 PlantUML 一切问题都迎刃而解,我们只需要用文字表达出要绘制的图的内容,然后直接生成图片。

2、环境、软件准备

本次演示环境,我是在虚拟机Linux Centos7上操作,以下是安装的软件及版本:

  1. Docker:version 1.12.6
  2. Git:version 2.10.1
  3. GitLab: GitLab Community Edition 9.1.4
  4. PlantUML Server:v2017.11

注意:GitLab 对 PlantUML 的支持版本必须 >= 8.16,PlantUML Server 安装这里我们选择 Docker 安装,这里 GitLab、Git、Docker 的安装忽略,着重讲一下如何在 GitLab 上使用 PlantUML 绘制各种图。

3、PlantUML Server 安装及 GitLab 配置

安装要求:

  1. jre / jdk 版本 >= 1.6
  2. maven 版本 >= 3.0.2

启动 PlantUML Server 服务,这里有三种方式启动服务:

1、使用 mvn jetty 启动服务

$ sudo yum install graphviz openjdk-7-jdk git-core maven
$ git clone https://github.com/plantuml/plantuml-server.git
$ cd plantuml-server
$ mvn package
$ mvn jetty:run #默认是8080,如果端口已占用,使用 mvn jetty:run -Djetty.port=9999 修改端口

2、使用 docker 启动服务

2.1 使用官方 plantuml/plantuml-server 镜像启动

我们可以选择 jetty 或者 tomcat 容器来启动服务
$ docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
$ docker run -d -p 8080:8080 plantuml/plantuml-server:tomcat

2.2 自己构建 plantuml-server 镜像启动

$ git clone https://github.com/plantuml/plantuml-server.git
$ cd plantuml-server
$ docker image build -t plantuml-server .
$ docker run -d -p 8080:8080 plantuml-server

3、使用 maven + tomcat 手动配置

$ sudo apt-get install graphviz openjdk-7-jdk git-core maven tomcat7
$ git clone https://github.com/plantuml/plantuml-server.git
$ cd plantuml-server
$ mvn package
$ sudo cp target/plantuml.war /var/lib/tomcat7/webapps/plantuml.war
$ sudo chown tomcat7:tomcat7 /var/lib/tomcat7/webapps/plantuml.war
$ sudo service tomcat7 restart

服务启动之后,PlantUML Server 监听http://localhost:8080/plantuml,注意:上边2.1服务启动完成后,监听http://localhost:8080

启动完成后,需要在 GitLab 上配置开启 PlantUML,管理员登录 -> Admin Area -> Settings,复选框选中 Enable PlantUML,输入 PlantUML URL(就是刚刚启动的 PlantUML Server 服务监听地址)。好了现在可以开始 PlantUML 之旅了。

4、实例 Demo

这里我们使用 Markdown 代码块的方式展示,只需要在 .md 文件中,按照 PlantUML 语法格式输入,在 GitLab上 点击 Preview 即可查看效果,它是以直接生成图片的方式,通过上边 PlantUML Server 服务生成图片,并提供图片访问,非常方便直观。

```plantuml
@startuml
Tomcat -> GitLab: Hello, my name is Tomcat
GitLab -> Tomcat: Hello, my name is GitLab
@enduml
```

说明:这是一个最简单的示例,PlantUML 代码段使用 “`plantuml 作为闭合表示为 PlantUML 代码段,@startuml 和 @enduml 为标准的 PlantUML 语法开始、结束标记,但是在 GiltLab 中该标记可以不写,也是可以识别的,在其他工具里面写最好带上吧。

4.1 时序图

4.1.1 时序图-基本-1

```plantuml
@startuml
title 时序图-基本-1 Tomcat -> GitLab: Hello, my name is Tomcat
GitLab -> Tomcat: Hello, my name is GitLab Tomcat -> GitLab: Nice to meet you.
Tomcat <-- GitLab: Nice to meet you too.
@enduml
```

4.1.2 时序图-扩展-2

```plantuml
@startuml
title 时序图-扩展-2 actor 用户
participant 参与者1 #yellow
participant "我的名字有点长\n参与者2" as p2 用户 -> 参与者1: http request
参与者1 -> 用户: http response
用户 -> p2: authentication request
用户 <-- p2: authentication response
用户 -> 用户: send message to myself.
@enduml
```

4.1.3 时序图-扩展-3

```plantuml
@startuml
title 时序图-扩展-3 actor 用户 #red
participant 参与者1 #yellow
participant 参与者2 #yellow
participant "我的名字有点长\n参与者3" as p3 #99FF99 autonumber
用户 -> 参与者1: This is message1
note left: This is left node message
参与者1 --> 参与者2: This is message2 ... Please wait 5s ...
参与者2 --> 参与者1: This is message3
note right: This is right node message
参与者1 -> 用户: This is message4 用户 -[#0000FF]> 参与者2: This is message5
用户 <-[#0000FF]- 参与者2: This is message6 == This is stage 1 ==
autonumber 10
用户 ->> p3: This is message10
note left of 用户
This is <color #118888>HTML</color> note
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked --
This is __underlined__
This is ~~waved~~
endnote 用户 <<-- p3: This is message11
note right of p3 #aqua
this is right note of p3
endnote
note over p3: This is note over p3 用户 -> 用户: This is message 12 to myself\n but it is too long. == This is stage 2 ==
autonumber 20 10
用户 -> 参与者1: This is message20
hnote over 用户: This is hnote message
参与者1 -> 用户: This is message30
rnote over 参与者1
This is rnote message_1
This is rnote message_2
endrnote == This is stage 3 ==
autonumber
participant "参与者4" as p4
ref over 用户: This is ref message
用户 -> p3: This is message1
activate p3
p3 -> p4: This is activate message
activate p4
||50||
ref over p4: This is ref message p4
p4 --> p3: This is deactivate message
deactivate p4
p3 --> 用户: This is message4
deactivate p3
@enduml
```

4.2 流程图

4.2.1 流程图-基本-1

```plantuml
@startuml
title 流程图-基本-1 start
:Hello world;
:This is GitLab **PlantUML Activity** Demo;
end
@enduml
```

4.2.2 流程图-扩展-2

```plantuml
@startuml
title 流程图-扩展-2 start
:Param;
-> This is arrows message;
floating note left: This is floating note left
if (condition A) then (yes)
:Do something for yes A|
if (condition B) then (yes)
:Do something for yes B>
elseif (condition C) then (yes)
:Do something for yes C<
stop
else (nothing)
:Do something for nothing/
endif
else (no)
:Do something for no A;
floating note right: This is floating note right
endif while (condition D?)
:Do something E}
:Do something F]
endwhile
end
@enduml
```

4.2.3 流程图-扩展-3

```plantuml
@startuml
title 流程图-扩展-3 start
:Param;
-> This is arrows message;
note left
This is note left with <color #FF0000>HTML</color>
This is Param note
end note
if (condition A) then (true)
-[#black,dashed]->
:Do something for yes A;
if (condition B) then (yes)
-[#000000]->
:Do something for yes B;
else
-[#green,bold]->
if (condition C) then (yes)
:Do something for yes C;
else (no)
:Do something for no C;
endif
endif
else (false)
-[#blue,dotted]->
:Do something for no A;
note right
This is note right with <color #118888>HTML</color>
====
* This is **bold**
* This is //italics//
* This is ""monospaced""
* This is --stroked --
* This is __underlined__
* This is ~~waved~~
end note
endif #AAAAAA:Do something D;
repeat
#Green:Do something E;
repeat while (condition F?)
stop
@enduml
```

4.3 活动图

4.3.1 活动图-基本-1

```plantuml
@startuml
title 活动图-基本-1 interface "Interface one" as i1
() "interface two" as i2
interface "Interface three" as i3
i1 - [Component]
[Component] ..> i2
[Component] -> i3
@enduml
```

4.3.2 活动图-扩展-2

```plantuml
@startuml
title 活动图-扩展-2 skinparam componentStyle uml2
[Component one] as c1
component [Component two] as c2
component "This name is too lang\nComponent three" as c3 #green
interface "Interface one" as i1
() "interface two" as i2 #AAAAAA
i1 - c1
c1 -> c2
c2 -right-> c3
c2 ..> i2: Component to Interface
c3 -up-> up: This is up
c3 -right-> right note top of c2: This is note top message
note bottom of c1: This is note bottom message
note left of i1
This is note left message with <color #FF0000>HTML</color>
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked --
This is __underlined__
This is ~~waved~~
endnote
note right of i2
This is note right message
But it is too lang
endnote
@enduml
```

4.3.3 活动图-扩展-3

```plantuml
@startuml
title 活动图-扩展-3 package "This is package" {
interface - [package 2]
[package 2] -> [package 3]
} node "This is node" {
[package 3] -- [node 1]
[node 1] --> [node 2]
} cloud {
[node 2] --> [cloud 1]
[node 2] --> [cloud 2]
[node 2] --> [cloud 3]
} database "This is Mysql" {
folder "This is folder" {
[folder 1]
[folder 2]
} frame "This is frame" {
[frame 1]
}
} [cloud 1] --> [folder 1]
[cloud 1] --> [folder 2]
[cloud 2] --> [folder 1]
[cloud 2] --> [folder 2]
[cloud 3] --> [frame 1]
@enduml
```

4.4 状态图

4.4.1 状态图-基本-1

```plantuml
@startuml
title 状态图-基本-1 [*] --> State1
State1: This is state message
State1: But it is too lang
State1 -> State2
State2 --> [*]
@enduml
```

4.4.2 状态图-扩展-2

```plantuml
@startuml
title 状态图-扩展-2 scale 350 width
[*] --> State1 state State1 {
[*] -> State1.1
State1.1 --> State2: State 1.1 to 2
State2 --> State1.1: State 2 to 1.1
} state State2 {
[*] --> State2.1
State2.1 --> State2.1.1: State 2.1 to 2.1.1
State2.1.1 --> State2.1: State 2.1.1 to 2.1 state State2.1.1 {
State2.1.1.1 -> State2.1.1.2
}
--
[*] -> State2.2
State2.2 --> State2.2.1: State 2.2 to 2.2.1
State2.2.1 --> State2.2: State 2.2.1 to 2.2
}
@enduml
```

4.4.3 状态图-扩展-3

```plantuml
@startuml
title 状态图-扩展-3 state "This is State2 name\nBut it is too lang" as State2
State2: This is State2 message
[*] --> State1
State1 --> State2: Successed
State1 --> [*]: Failed
State2 --> State3: Successed
State2 --> [*]: Failed state State3 {
state "This is State3.1 name\nBut it is too lang" as State3.1
State3.1: This is State3.1 message
[*] --> State3.1
State3.1 --> State3.2: State 3.1 to 3.2
State3.2 --> State3.1: State 3.2 to 3.1
State3.1 --> State3.1: Failed
} State3 --> State3: Failed
State3 --> [*]: Successed
State3 --> [*]: Failed note right of State1: This is note right
note left of State3
This is note right with <color #FF0000>HTML</color>
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked --
This is __underlined__
This is ~~waved~~
endnote
@enduml
```

4.5 用例图

4.5.1 用例图-基本-1

```plantuml
@startuml
title 用例图-基本-1 actor User
actor :I am administrator: as Admin
usecase Case User --> Case
Admin --> Case
@enduml
```

4.5.2 用例图-扩展-2

```plantuml
@startuml
title 用例图-扩展-2 actor User
actor :I am administrator: as Admin
usecase Case1 as "This is usecase message
But it is too lang
--
This is -- message
==
This is == message
..introduction..
This is .. message" User -> (Start)
User --> Case1 : I am User
Admin ---> Case1 : I am administrator
note right of Admin
This is note right with <color #FF0000>HTML</color>
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked --
This is __underlined__
This is ~~waved~~
endnote
note bottom of Case1: This is note bottom
note "This is note message" as n
(Start) .. n
n .. Case1
@enduml
```

4.5.3 用例图-扩展-3

```plantuml
@startuml
title 用例图-扩展-3 left to right direction
skinparam packageStyle rectangle
actor User1 <<用户>>
actor User2 <<用户>>
actor :I am administrator: as Admin <<管理员>> rectangle actions {
User1 -- (Start)
User2 -- (Start)
(Start) --> (action): Begin
(action) .> (action1): Use
(action2) .> (action): Extends
(action) --> (End): End
(End) -- Admin
}
@enduml
```

4.6 类图

4.6.1 类图-基本-1

```plantuml
@startuml
title 类图-基本-1 Class1 --|> Class2
Class1 -- Class3
Class3 *-- Class4
Class3 -o Class5
Class5 ..|> Class6
Class5 -> Class7
Class7 <.. Class8
Class7 -x Class9
Class9 --+ Class10
Class9 -# Class11
Class11 <--* Class10
@enduml
```

4.6.2 类图-扩展-2

```plantuml
@startuml
title 类图-扩展-2 Class1 "extends" <|-- Class2: Class2 to Class1
Class1 *-- "Composie" Class3
Class3 <|-- Class4: extends
User -o Class2: User to Class2
Class1 : -Field1
Class1 : #Field2
Class1 : ~Method1()
Class1 : +Method2() class Class2 {
int id
String data
int getSize()
void save()
void update()
void delete()
List<String> getList()
} class Class3 {
This is Class3 message
But it is too lang
..
This Class3 .. message
==
This is Class == message
__
This is Class __ message
--
This is Class -- message
But it it too lang
} class User {
This is class User
..get method..
+getName()
+getAddress()
..set method..
+setName()
+setAddress()
__private field__
-int age
-String sex
--protect field--
#String phone
--static field--
{static} String id
--abstract method--
{abstract} void methods()
} note left of Class1: This is note left
note top of User #red
This is note top of User
But it is too lang
endnote
note right of Class3
This is note with <color #118888>HTML</color>
This is **bold**
This is //italics//
This is ""monospaced""
This is --stroked --
This is __underlined__
This is ~~waved~~
endnote
note "This is note message" as n
Class3 .. n
n ..Class4
@enduml
```

4.6.3 类图-扩展-3

```plantuml
@startuml
title 类图-扩展-3 abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection List <|-- AbstractList
Collection <|-- AbstractCollection
Collection <|- List
AbstractCollection <|-- AbstractList package java.util {
AbstractList <|-- ArrayList
class ArrayList {
This is package java.util
}
} namespace net.test {
com.test.ArrayList <|- ArrayList
class ArrayList {
This is namespace net.test
}
} ArrayList <|-- net.test.ArrayList namespace com.test {
AbstractList <|-- ArrayList
class ArrayList {
This is namespace com.test
}
} class ArrayList <? extends Element> {
Object[] elementData
int size()
} package "enum and annotation" #DDDDDD {
enum HttpMethod {
POST
GET
PUT
DELETE
PATCH
} annotation Annotation
}
@enduml
```

4.7 其他图

4.7.1 其他图-基本组件-1

```plantuml
title 其他图-基本组件-1
@startsalt
{
[确认按钮]
() 单选按钮(未选中)
(X) 单选按钮(选中)
[] 复选框(未选中)
[X] 复选框(选中)
"请输入电子邮件"
^请选择下拉列表^
}
@endsalt
```

4.7.2 其他图-表格-2

```plantuml
title 其他图-表格-2
@startsalt
{+
用户名: | "请输入用户名/邮箱"
密 码: | "请输入密码"
[ 确认 ] | [ 取消 ]
}
@endsalt
```

4.7.3 其他图-表格-3

```plantuml
title 其他图-表格-3
@startsalt
{#
column1 | column2 | column3 | column4
row1 | value1_2 | value1_3 | value1_4
row2 | value2_2 | value2_3 | value2_4
}
@endsalt
```

4.7.4 其他图-选项卡-4

```plantuml
title 其他图-选项卡-4
@startsalt
{+
{/ <b>Tab1 | Tab2 | Tab3 | Tab4 }
{
用户名: | "请输入用户名"
性 别: | { (X) 男 | () 女 }
爱 好: | { [X]唱歌 | []游泳 | [X]篮球 | []自行车 | []其他 }
图 像: | { " " | [ 上传 ] }
地 址: | " "
[ 确认 ] | [ 取消 ]
}
}
@endsalt
```

4.7.5 其他图-菜单-5

```plantuml
title 其他图-菜单-5
@startsalt
{+
{* 文件 | 查找 | 视图 | 窗口 | 工具 | 帮助
文件 | 新建 | 打开文件 | 打开文件夹 | - | 保存 | 打印 | 退出}
{/ <b>Tab1 | Tab2 | Tab3 | Tab4 }
{
用户名: | "请输入用户名"
性 别: | { (X) 男 | () 女 }
爱 好: | { [X]唱歌 | []游泳 | [X]篮球 | []自行车 | []其他 }
图 像: | { " " | [ 上传 ] }
地 址: | " "
[ 确认 ] | [ 取消 ]
}
}
@endsalt
```

4.7.6 其他图-折叠树-6

```plantuml
title 其他图-折叠树-6
@startsalt
{
{T
+ Folder
++ Folder1
+++ Folder1.1
++++ File1.1.1
++ Folder1.2
+++ File1.2.1
+++ File1.2.2
+++ File1.2.3
++ Folder2
+++ File2.1
+++ Folder2.2
++++ File2.2.1
++ Folder3
}
}
@endsalt
```

好了,PlantUML 还有其他类型的图,这里就不一一举例子了。如果想尝试的话,除了在 GitLab 上,还可以在 Sublime 安装插件,或者是在 Eclipse 上安装插件,再或者是在 IntelliJ IDEA 上安装插件体验尝试吧。

参考资料

  1. GitLab PlantUML Config
  2. PlantUML Server Github
  3. PlantUML 官网
  4. PlantUML Guide PDF

GitLab 之 PlantUML 的配置及使用的更多相关文章

  1. CentOS 系统下Gitlab搭建与基本配置 以及代码备份迁移过程

    GitLab 是一个开源的版本管理系统,提供了类似于 GitHub 的源代码浏览,管理缺陷和注释等功能,你可以将代码免费托管到 GitLab.com,而且不限项目数量和成员数.最吸引人的一点是,可以在 ...

  2. GitLab CI持续集成配置方案(补)

    上篇文章介绍了GitLab CI的持续集成配置方法,本篇文章将主要介绍NUnit的持续集成和遇到的一些坑 1.NUnit单元测试持续集成 下载NUnit.3.4.1.msi,https://githu ...

  3. GitLab CI持续集成配置方案

    目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...

  4. GitLab服务器搭建及配置

    一.服务器环境 操作系统:CentOS release 6.5 (Final) GitLab版本: GitLab-shell:2.0.1 Ruby version: ruby 2.1.2p95 (20 ...

  5. gitlab&fengoffice的ldap配置

    1.fengoffice配置config/ldap_config.php $config_ldap = array ( 'binddn' => 'cn=admin,dc=xxx,dc=xxx', ...

  6. DevOps之一 Gitlab的安装与配置

    gitlab的安装 参考治疗:https://www.gitlab.com.cn/installation/#centos-7 http://www.21yunwei.com/archives/435 ...

  7. 【jenkins】jenkins+maven+gitlab+testng,jenkins配置

    电脑版本:windows10企业版 jenkins配置: 1.general配置,这里的配置比较简单,基本默认就可以了 2.源码管理 2.1填写git地址,从你的gitlib项目里去找.不会的自行百度 ...

  8. Jnekins+Gitlab代码提交全程配置

    实验环境: 测试机:192.168.2.156 Jenkins:192.168.2.157 Gitlab:192.168.2.158 温馨提示:如果不知道,Jenkins和Gitlab安装过程~可参考 ...

  9. gitlab之三: gitlab邮件通知的配置

    参考 :  https://www.cnblogs.com/lovelinux199075/p/9072265.html gitlab 添加新用户后,会自动发送邮件到填写的邮箱. 实验版本:  11. ...

随机推荐

  1. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  2. Mysql性能调优-工具篇

    EXPLAIN 首先祭出官方文档(这是5.7的,请自行选择版本): Understanding the Query Execution Plan 英文不想看,就看这篇吧: 全网最全 | MySQL E ...

  3. (转)git使用收集

    由于最近项目开始弃SVN用git,特意整理下git命令.原文链接为http://www.jb51.net/article/55442.htm git branch 查看本地所有分支git status ...

  4. C#里如何简单的校验时间格式

    前言: 晚上打算睡觉的时候,群里反馈订单接收失败,开工排查问题,日志显示验签失败,发现一个蛮有意思的BUG,总算有了一个写作的素材 场景描述 本次的场景属于比较常见的收单API,对第三方的订单进行签名 ...

  5. FreeSql 将 Saas 租户方案精简到极致[.NET ORM SAAS]

    什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个租户是一组共享该软件实例特定权限的用户.有了多租户架构 ...

  6. 年度开源盛会 ApacheCon 首发中文盛宴来临,欢迎报名!

    ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯 1998 年,也是在这一届上,开发 HTTPD 服务的开发者们欢聚一堂,并决定 ...

  7. 微信小程序检查版本更新并重启

    目录 1,前言 2,解决方案 3,调试须知 1,前言 最近开发小程序时候碰上了一个问题,当发布新版本小程序后,需要用户能赶紧用上最新的,避免出问题.查了一下官方文档,总结出几个情况如下: 微信运行时, ...

  8. Excelize 2.5.0 正式发布,这些新增功能值得关注

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

  9. docker的volume和bind mount究竟有什么区别?

    不知道你在使用docker的时候,有没有注意到volume mount和bind mount的使用? 进一步说,他们之间的区别到底是什么? 接下来的内容,我们就为你揭开他们的神秘面纱. 相同之处 首先 ...

  10. 2-1 走进selenium新世界

    走进Selenium新世界 浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展 ...