長くなるので、図の書き方はクラス図とシーケンス図だけで。
PlantUML とは
- テキストで UML 図を記述できる DSL の一種(たぶん)
- 本体は Java で書かれていて、単一の jar ファイルを落としてきてコマンドラインから実行できる
- ただし、実際に使うときは Visual Studio Code とかのプラグインを入れて実行することが多いと思う
- ライセンスは GPL v3
環境構築
OS は Windows10。
Java
> java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)
インストール方法は割愛。
PlantUML 本体
https://plantuml.com/ja/download
ここから plantuml.jar を落としてくる。
確認時点では plantuml.1.2020.7.jar だった。
Graphviz
http://www.graphviz.org/download/
図の描画に使用しているソフトウェアっぽい。
Graphviz - Wikipedia
シーケンス図とアクティビティ図 以外 の図を生成したい場合は必要なので、事実上必須。
自分が落としたのは 2.38。
dot.exe の場所を指定する
PlantUML を実行するときに、 Graphviz に含まれている dot.exe の場所を指定する必要がある。
指定方法は次のいずれか(採用される優先度が高いモノ順に並べている)。
-
-graphvizdotオプションで指定する - システムプロパティ
GRAPHVIZ_DOTで指定する - 環境変数
GRAPHVIZ_DOTに設定する
仮に、 Graphviz をインストールしたフォルダが C:\Graphviz だったとすると、次のような感じで指定する。
-graphvizdotオプションで指定した場合
> java -jar plantuml.jar -graphvizdot C:\Graphviz\bin\dot.exe ...
システムプロパティで指定した場合
> java -DGRAPHVIZ_DOT=C:\Graphviz\bin\dot.exe -jar plantuml.jar ...
環境変数で指定した場合
> set GRAPHVIZ_DOT
GRAPHVIZ_DOT=C:\Graphviz\bin\dot.exe
VSCode
以下のプラグインを使う場合は、 VSCode を実行する前に環境変数 GRAPHVIZ_DOT を設定しておく。
PlantUML
PlantUML - Visual Studio Marketplace
- VSCode で PlantUML を書くためのプラグイン
-
Alt+dでプレビューが表示される - 複数の
@startuml...@endumlがある場合は、現在カーソルが存在する場所の図がプレビューされる
Markdown Preview Enhanced
Markdown Preview Enhanced - Visual Studio Marketplace
- Markdown 中の PlantUML をプレビューできるようにするプラグイン
-
Ctrl+k,vでプレビューが表示される
Hello World
hello.pu
@startuml
Hello <|-- World
@enduml
- テキストファイルを作って、中身を↑のように記述する
- ファイルの拡張子は
puが慣例?
実行
> java -jar plantuml.jar hello.pu
- 引数に作成したテキストファイルを指定して実行する
- すると、引数で指定したファイルと同じ場所に
hello.pngというファイルが出力される
hello.png
コマンドラインからの実行方法
ファイル指定
> dir /b
fuga.pu
hoge.pu
piyo.pu
> java -jar plantuml.jar hoge.pu fuga.pu piyo.pu
> dir /b
fuga.png
fuga.pu
hoge.png
hoge.pu
piyo.png
piyo.pu
- ファイルのパスを引数に指定して実行できる
- ファイルは複数指定可能
- ファイル名と同じ名前の png ファイルが、ファイルと同じ場所に生成される
ディレクトリ指定
フォルダ構成
`-hoge/
|-plantuml.pu
|-markdown.md
|-JavaSource.java
`-fuga/
`-fuga.pu
-
hogeディレクトリの直下に、3つのファイルを配置している - それぞれ、中身は次のようになっている
plantuml.pu
@startuml
class PlantUml
@enduml
markdown.md
```
@startuml
class Markdown
@enduml
```
JavaSource.java
/**
* @startuml
* class JavaSource {
* - String message
* }
* @enduml
*/
public class JavaSource {}
-
hogeフォルダの下にはfugaディレクトリがあり、その下にはfuga.puファイルを配置している
fuga.pu
@startuml
class Fuga
@enduml
実行
> java -jar plantuml.jar hoge
実行後
`-hoge/
|-plantuml.pu
|-plantuml.png
|-markdown.md
|-JavaSource.java
|-JavaSource.png
`-fuga/
`-fuga.pu
-
plantuml.pngとJavaSource.pngが生成されている
plantuml.png
JavaSource.png
- フォルダを指定して実行すると、そのフォルダ直下に存在するファイルが自動的に読み込まれる
- 次の拡張子に該当するファイルが、読み込みの対象となっている
.c.h.cpp.txt.pu.tex.html.htm.java
- これらのファイルの中に
@startumlからはじまり@endumlで終わる部分を見つけると、その部分から画像を生成してくれる
ワイルドカードで指定する
- ↑と同じ構成で、次は以下のようにコマンドを実行する
> java -jar plantuml.jar "hoge/**"
- フォルダを指定した部分を、
"hoge/**"としている
実行結果
`-hoge/
|-plantuml.pu
|-plantuml.png
|-markdown.md
|-markdown.png
|-JavaSource.java
|-JavaSource.png
`-fuga/
|-fuga.pu
`-fuga.png
-
markdown.pngやfuga.pngも生成されている
markdown.png
fuga.png
- 対象の指定には、次のワイルドカードが使用できる
-
*任意の文字列 -
?任意の1文字 -
**任意のサブディレクトリ
-
除外対象を指定する
> java -jar plantuml -x "**/*.pu" "hoge/**"
実行結果
`-hoge/
|-plantuml.pu
|-markdown.md
|-markdown.png
|-JavaSource.java
|-JavaSource.png
`-fuga/
`-fuga.pu
- 拡張子が
puのファイルだけ png ファイルが生成されていない -
-xオプションで除外対象を指定できる
文字コードの指定
> java -jar plantuml.jar -charset UTF-8 hello.pu
- 文字コードは
-charsetオプションで指定する
標準入力から読み込む
> type plantuml | java -jar plantuml.jar -pipe > result.png
-
-pipeオプションを指定すると標準入力から読み込むので、パイプが可能になる - 結果は標準出力に書き出されるので、適当なファイルにリダイレクトしてあげればいい
複数の図の記述が存在した場合
hoge.pu
@startuml
class Hoge
@enduml
@startuml
class Fuga
@enduml
@startuml
class Piyo
@enduml
- 1つのファイル内に複数の
@startuml...@endumlの記述が存在した場合
実行
> java -jar plantuml.jar hoge.pu
実行結果
> dir /b
hoge.png
hoge.pu
hoge_001.png
hoge_002.png
hoge.png
hoge_001.png
hoge_002.png
- 最初の図が
ファイル名.pngで生成される - 残りの図は、
ファイル名_XXX.pngの連番で生成される- 1000個以上あったらどうなるのかは試していない
図ごとにファイル名を指定する
hoge.pu
@startuml hoge
class Hoge
@enduml
@startuml fuga
class Fuga
@enduml
@startuml piyo
class Piyo
@enduml
- 各
@startumlの後ろに名前を記述している
実行
> java -jar plantuml.jar hoge.pu
実行結果
> dir /b
fuga.png
hoge.png
hoge.pu
piyo.png
hoge.png
fuga.png
pioy.png
-
@startuml 名前とすることで、図ごとのファイル名を指定できる
ヘルプの表示
> java -jar plantuml.jar -h
- ヘルプは、
-hまたは-helpで表示できる
共通
コメント
@startuml no-scale
' これはコメント
Hello <|-- World
@enduml
- シングルクォーテーション (
') から後ろはコメント扱いになる
タイトル
@startuml
title Hello Title
Hello <|-- World
@enduml
-
title タイトルと記述することで、図のタイトルを設定できる
複数行のタイトル
@startuml
title
Hello
Title
end title
Hello <|-- World
@enduml
-
titleとend titleで囲うことで、複数行のタイトルが記述できる
マークアップ言語で書く
@startuml
title
* __Hello__
* **World**
end title
Hello <|-- World
@enduml
- Creole というマークアップ言語を使用できる
- Creole の記述例はこちら
キャプション
@startuml
caption 図1
Hello <|-- World
@enduml
-
caption キャプションで、図のキャプションを設定できる
ヘッダー・フッター
@startuml
header Hello
Hello <|-- World
footer World
@enduml
-
header ヘッダーコメント,footer フッターコメントで、ヘッダーとフッターを指定できる - デフォルトだと、ヘッダーは右寄せ、フッターはセンタリングになる
- Creole で記述できる
位置を指定する
@startuml
left header Hello
Hello <|-- World
right footer World
@enduml
-
left,center,rightをheader,footerの前に記述することで、位置を調整できる
複数行で書く
@startuml
header
Hello
Header
end header
Hello <|-- World
footer
World
Footer
end footer
@enduml
-
header ... end header,footer ... end footerで囲むことで、複数行で記述できる
凡例
@startuml
legend
Hello World
end legend
Hello <|-- World
class FizzBuzz
@enduml
-
legend ... end legendで、凡例を挿入できる - デフォルトでは、中央下に配置される
位置を指定する
-
legendの後ろに上下の位置 (top,bottom) と左右の位置 (left,center,right) を指定できる
@startuml right
legend right
Right
end legend
Hello <|-- World
class FizzBuzz
@enduml
- 左右の位置だけ指定した場合、上下の位置はデフォルトの
bottomになる
@startuml top
legend top
Top
end legend
Hello <|-- World
class FizzBuzz
@enduml
- 上下の位置だけ指定した場合、左右の位置はデフォルトの
centerになる
@startuml top-left
legend top left
Top Left
end legend
Hello <|-- World
class FizzBuzz
@enduml
- 両方とも指定した場合は、指定された位置に表示される
- このとき、
legend left topのように上下と左右の位置指定を逆にするとエラーになる- 必ず、上下の位置→左右の位置の順番で指定する必要がある
拡大率
@startuml no-scale
Hello <|-- World
@enduml
@startuml scale-1.5
scale 1.5
Hello <|-- World
@enduml
@startuml scale-0.5
scale 0.5
Hello <|-- World
@enduml
-
scale 拡大率と記述することで、その図の拡大率を指定できる
Creole
- wiki 記述言語の1つ
- タイトルやノートで、この記法が使用できる
@startuml
note left
--見出し--
= 見出し1
== 見出し2
=== 見出し3
--番号なしリスト--
* リスト1
* リスト2
** リスト2-1
* リスト3
--番号付き--
# 番号付きリスト1
# 番号付きリスト2
## 番号付きリスト2-1
# 番号付きリスト3
--装飾--
* **太字**
* //イタリック//
* ""等幅フォント(monospace)""
* --取り消し線--
* __下線__
--テーブル--
|= |= Column1 |= Column2 |
|1 |Value1-1 |Value1-2 |
|2 |Value2-1 |Value2-2 |
--HTML--
* <color:red>色名指定</color>
* <color:#00FF00>カラーコード指定</color>
* <back:skyblue>背景色</back>
* <size:18>フォントサイズ</size>
* <b>太字</b>
--木構造--
|_build.gradle
|_src
|_main
|_java
|_**bold**
|_--strike--
|_//itaric//
|___underline__
|_""monospace""
|_test
--Unicode--
* <U+20BB7>
--Escape--
* **これは太字になる**
* ~**これは太字にならない**
--水平線--
--タイトルを挟める--
----
==タイトルを挟める==
====
..タイトルを挟める..
....
end note
@enduml
フォントを指定する
@startuml
skinparam DefaultFontName メイリオ
おはよう <|-- 世界
@enduml
-
skinparam DefaultFontName フォント名と記述することで、デフォルトのフォントを指定できる -
skinparamは、skinparam <key> <value>という書式で様々なスキン設定を指定できる -
DefaultFontNameはデフォルトのフォントを指定するキー -
CaptionFontNameやClassFontNameのように、特定の要素ごとにフォントを指定することも可能 -
<key>に指定できる値の一覧は、次のコマンドで確認できる
> java -jar plantuml.jar -language
...
;skinparameter
;536
ActivityBackgroundColor
ActivityBarColor
ActivityBorderColor
ActivityBorderThickness
ActivityDiamondBackgroundColor
ActivityDiamondBorderColor
ActivityDiamondFontColor
...
クラス図
クラスを宣言する
@startuml
class Hello
class World
@enduml
-
class <型名>と記述することで、クラスを宣言できる
インターフェースを宣言する
@startuml
interface Hello
interface World
@enduml
-
interface <型名>と記述することで、インターフェースを宣言できる
抽象クラスを宣言する
@startuml
abstract class Hello
@enduml
-
abstract class <型名>とすることで、抽象クラスを宣言できる
enum を宣言する
@startuml
enum HelloWorld {
ONE
TWO
THREE
}
@enduml
-
enum <型名>で、 enum を宣言できる - 続けて波括弧
{...}を書き、そのなかで定数を宣言できる
型間の関連を記述する
関連(リンク)
@startuml
Hello -- World
@enduml
-
<型名> <関連を表す線> <型名>と記述することで、型間の関連を記述できる -
--は、単純な関連だけを記述できる -
class <型名>で宣言していない型でも使用可能- 宣言と合わせて記述することも可能
誘導可能性の表現
@startuml
class One
One --> Two
Three <-- Four
Five <--> Six
Seven x-- Eight
Nine --x Ten
@enduml
-
<,>,xで、誘導可能性を表現できる
依存
@startuml
One ..> Two
Three <.. Four
@enduml
-
..>,<..で、依存を表現できる
汎化
@startuml
One --|> Two
Three <|-- Four
@enduml
-
<|--,--|>で、汎化を表現できる
実現
@startuml
One ..|> Two
Three <|.. Four
@enduml
-
..|>,<|..で、実現を表現できる
集約
@startuml
One --o Two
Three o-- Four
@enduml
-
--o,o--で、集約を表現できる
コンポジション
@startuml
One --* Two
Three *-- Four
@enduml
-
--*,*--で、コンポジションを表現できる
関連名
@startuml
One -- Two : Hoge
Three -- Four : Fuga >
Five -- Six : < Piyo
@enduml
- 関連を記述した後ろに
:を入れると、そのさらに後ろに関連名を記述できる - 関連名の前後に
<,>を入れることで、関連の方向性を表現できる
ロール名と多重度
@startuml
One "Foo" -- Two
Three -- "Bar" Four
Five "1" -- "1..*" Six
Seven "1 Fizz" -- "~* Buzz" Eight
@enduml
- 型名と関連の線の間にダブルクォーテーション (
") で囲った文字列を記述することで、ロール名または多重度を記述できる - ロール名用・多重度用に記述が分かれておらず、この記法をうまく利用して両方を記述しなければならないっぽい
- なお、
* Buzzのようにアスタリスク (*) で始めてしまうと Creole 記法のリスト扱いになってしまうので、~でエスケープする必要がある
フィールド・メソッドの定義
@startuml
class Hello {
one: String
three(param1: String, param2: int): boolean
String two
int four(List<String> param)
}
@enduml
-
class <型名>の後に波括弧 ({...}) で囲った中で、フィールドやメソッドを宣言できる - UML として正式な記述 (
フィールド名: 型名) だけでなく、 Java 的な書き方 (型名 フィールド名) でも書ける- 結構なんでも書けるっぽいが、 UML の正式な記法にしておくのが無難だとは思う
- フィールドとメソッドは自動的に判定されて、よしなにクラス図のそれぞれの部分に描画される
- こちらも、あえて混在させる必要はなく、キレイに分けて書いておいたほうが無難
可視性
@startuml
class Hello {
- privateField: int
# protectedField: int
~ packagePrivateField: int
+ publicField: int
- privateMethod(): void
# protectedMethod(): void
~ packagePrivateMethod(): void
+ publicMethod(): void
}
@enduml
- UML の記法で可視性を記述すると専用のアイコン表示になる
- 逆に分かりにくいって場合は、以下の様にしてアイコン表示をオフにすることもできる
@startuml
skinparam classAttributeIconSize 0
class Hello {
- privateField: int
# protectedField: int
~ packagePrivateField: int
+ publicField: int
- privateMethod(): void
# protectedMethod(): void
~ packagePrivateMethod(): void
+ publicMethod(): void
}
@enduml
-
skinparam classAttributeIconSize 0を設定すると、可視性のアイコン表示は消える
抽象メンバー
@startuml
class Hello {
{abstract} one: int
{abstract} two(): int
}
@enduml
- メンバーの先頭に
{abstract}とつけることで、抽象メンバーにできる
静的メンバー
@startuml
class Hello {
{static} ONE: int
{static} two(): int
}
@enduml
- メンバーの先頭に
{static}とつけることで、静的メンバーにできる
ステレオタイプ
@startuml
class Hello <<Hoge>>
class World <<Fuga>> {
message: String
}
@enduml
- 型名の後ろに
<<ステレオタイプ>>と記述することで、ステレオタイプを記述できる
テンプレート
@startuml
class Hello<H>
class World<W> <<Hoge>>
@enduml
- 型名の直後に
<名前>と記述することで、テンプレートを表現できる - ステレオタイプとの併用も可能
実現や汎化を Java コードっぽく書く
@startuml
interface One
interface Two
interface Three extends Two
interface Four
class Five implements One, Three
class Six extends Five implements Four {
field: String
method(): void
}
@enduml
-
extendsやimplementsを使って、まんま Java コードっぽく書ける - これは捗る
パッケージ
@startuml
package one.two {
class Hello
}
package three.four {
World -- Hello
}
@enduml
-
package <名前> {...}と記述することで、パッケージを表現できる - 波括弧の中では、クラスや関連を記述できる
宣言の順序に注意
パッケージ宣言の順序を逆転した場合
@startuml
package three.four {
World -- Hello
}
package one.two {
class Hello
}
@enduml
-
Helloクラスはone.twoパッケージで宣言しているつもりだが、先に登場しているthree.fourパッケージに含まれてしまっている - どうやら、上から順番に見ていって最初に登場したパッケージ内で宣言したことになるっぽい
ノート
@startuml
class Fizz
note left: fizz
class Buzz
note right: buzz
class Foo
note top: foo
class Bar
note bottom: bar
@enduml
- クラスなどの宣言のうしろに
note <top|bottom|left|right>: <コメント>と記述することで、直前の要素にたいしてノートを記述できる - Creole での記述も可能
ノートをつける要素を指定する
@startuml
Fizz -- Buzz
note left of Fizz: fizz
note right of Buzz: buzz
@enduml
-
note <位置> of <対象>: <コメント>と記述することで、<対象>で指定した要素に対してノートをつけることができる
関連にノートをつける
@startuml
Fizz -- Buzz
note on link: fizz-buzz
note left: buzz
@enduml
- 型間の関連を記述したあとに
note on link: <コメント>と記述することで、関連に対してノートをつけることができる
ノートに名前をつける
@startuml
note "Hello World" as n1
Hello -- n1
World .. n1
note "Fizz Buzz" as n2
@enduml
-
note "<コメント>" as <名前>と記述することで、ノートに任意の名前を割り当てることができる - 割り当てた名前を使って、好きな要素とノートを紐付けることができる
- 型間の関連を書くのと同じような要領で線を引ける
- この記法なら、単独のノートを記述することもできる
複数行のノートを書く
@startuml
class Hello
note left
Hello
World
end note
Fizz -- Buzz
note on link
Fizz
Buzz
end note
note left of Fizz
fizz
buzz
end note
note as n1
Foo
Bar
end note
@enduml
- 各ノートの記法は、
end noteで終わらせることで複数行で書くことが可能
シーケンス図
同期メッセージ
@startuml
Alice -> Bob: Hi
Bob --> Alice: Hi
Alice -> Bob: Is this a pen?
Bob --> Alice: No! This is an apple!!
@enduml
- シーケンス図は、基本的に
<要素> <メッセージ> <要素>: <メッセージ名>と記述していく -
<メッセージ>は、->で同期メッセージになる -
-->は線が点線になり、応答メッセージに使用できる
非同期メッセージ
@startuml
Alice ->> Bob: Hi
Alice ->> Bob: Is this a pen?
Alice ->> Bob: Is this a pen??
Alice ->> Bob: Is this a pen???
Alice ->> Bob: Is this a pen????
Bob -> Alice: This is an apple!!!
@enduml
-
->>と記述することで、非同期メッセージを表現できる
ライフラインの並び順を指定する
@startuml
participant Alice
participant Bob
participant Carol
Carol -> Bob: Is the tip included?
Bob -> Alice: いずれテッペン超えれる?
@enduml
- 何もしないと、ライフラインは上から現れた順番で、左から並べられる
- ライフラインの順序を指定したい場合は、
paritcipant <ライフラインの名前>という形で別途並びを定義しておく
ライフラインにアイコンを使う
@startuml
actor Actor
boundary Boundary
control Control
entity Entity
database Database
collections Collections
@enduml
-
participantの代わりに特定のキーワードを指定することで、役割に合わせたアイコンを使用できる
自分自身へのメッセージ
@startuml
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
@enduml
- 自分自身にメッセージを送ることもできる
メッセージに番号を振る
@startuml
Alice -> Bob: Hi
autonumber
Bob -> Carol: Hi
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml
- メッセージの前に
autonumberと記述することで、その後のメッセージに自動的に番号を振ることができる
開始番号と増分を指定する
@startuml
autonumber 3
Alice -> Bob: Hi
Bob -> Carol: Hi
autonumber 2 3
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml
-
autonumber <開始> <増分>のようにして、開始番号と増分を指定できる
自動採番の一時停止・再開
@startuml
autonumber
Alice -> Bob: Hi
autonumber stop
Bob -> Carol: Hi
Carol -> Dave: Hi
autonumber resume
Bob -> Dave: Hi
Carol -> Dave: Hi
@enduml
-
autonumber stopで、自動採番を中断できる -
autonumber resumeで、中断したところから自動採番を再開できる
メッセージのグループ化
@startuml
Alice -> Bob: Is this a pen?
alt yes
Alice <-- Bob: Yes! This is a pen!!
else no
Alice <-- Bob: Noooooooo! This is an apple!!!!!
end
@enduml
- 特定のキーワードを使うことでメッセージをグループ化できる
- 使用できる予約済みのキーワードは以下
-
alt/else optloopparbreakcritical
-
- キーワードの後ろに任意の文字列を記述できる(分岐の条件などを記述できる)
- インデントは必要ないが、しておいたほうが見やすいと思う
- グループは次のように入れ子が可能
入れ子にした場合
@startuml
Alice -> Bob: Is this a pen?
alt yes
Alice <-- Bob: Yes! This is a pen!!
else no
Alice <-- Bob: Noooooooo! This is an apple!!!!!
loop ∞
Alice -> Bob: Oh sorry! By the way, is this a pen?
Alice <-- Bob: Noooooooooooooooooo!!!!
end
end
@enduml
任意の名前のグループを作る
@startuml
group コピペ
Alice -> Bob: Is this a pen?
Alice <-- Bob: No! This is an apple!!
end
@enduml
-
group <名前>とすることで、任意の名前のグループを書ける - この場合、
altなどでかけたような条件に当たるところの記述はできない
実行仕様
@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml
-
activate <名前>で、指定した名前のライフラインの実行仕様を表現できる -
deactive <名前>で明示的に非活性化させる必要がある
入れ子にする
@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml
- 実行仕様は入れ子にできる
ライフラインの生成
@startuml
Alice -> Bob
create Carol
Bob -> Carol: new
Bob -> Carol
Bob <-- Carol
Alice <-- Bob
@enduml
-
create <名前>と記述することで、指定した名前のライフラインを途中から生成できる
リファレンス
@startuml
Alice -> Bob
ref over Bob, Carol: あっちを参照
Alice <-- Bob
ref over Alice
そっちを
参照
end ref
@enduml
-
ref over <リファレンスで囲う対象>: <説明>と記述することで、リファレンスを記述できる - リファレンスで囲う対象には、ライフラインの名前をカンマ区切りで複数指定できる
-
ref over ... end refとすることで複数行で記述することも可能
境界線
@startuml
== Foo ==
Alice -> Bob
Alice <-- Bob
== Bar ==
Bob -> Carol
Bob <-- Carol
@enduml
-
== <名前> ==と書くことで、境界線を記述できる
外部からの(への)メッセージ
@startuml
[-> Alice: Hello
Alice ->]: Hello
@enduml
- ライフラインの名前の代わりに
[,]を使うことで、外部からの(への)メッセージを記述できる
メッセージの間に間隔をあける
@startuml
Alice -> Bob
Alice <-- Bob
Alice -> Bob
Alice <-- Bob
|||
Alice -> Bob
Alice <-- Bob
||80||
Alice -> Bob
Alice <-- Bob
@enduml
- メッセージの間に
|||を挟むことで、少し間隔をあけることができる -
||<ピクセル>||とすれば、間隔の大きさをピクセルで指定できる
ノート
@startuml
Alice -> Bob
note left: Hello
Alice <-- Bob
note right: World
Alice -> Alice
note left
Hello
World
end note
@enduml
- メッセージの直後に
note leftまたはnote rightのいずれかでノートをつけることができる-
top,bottomは使えない(使うとクラス図として解釈されてしまう)
-
-
note <left|right> ... end noteとすることで複数行で書くことも可能 - Creole で記述可能
Java から使う
Graphviz の指定
- コマンドラインから実行するときと同様で、 Graphviz の
dot.exeの場所を指定しなければならない - コマンドラインオプションはないので、システムプロパティか環境変数での設定になる
依存関係の指定
build.gradle
plugins {
id "application"
}
sourceCompatibility = 11
targetCompatibility = 11
compileJava.options.encoding = "UTF-8"
mainClassName = "sandbox.plantuml.Main"
repositories {
mavenCentral()
}
dependencies {
implementation "net.sourceforge.plantuml:plantuml:8059"
}
- net.sourceforge.plantuml:plantuml を依存関係に追加する
String ソースから読み込む
Main.java
package sandbox.plantuml;
import net.sourceforge.plantuml.SourceStringReader;
import java.io.File;
public class Main {
public static void main(String[] args) throws Exception {
String source = "@startuml\n"
+ "Foo <-- Bar\n"
+ "@enduml";
final SourceStringReader reader = new SourceStringReader(source);
reader.generateImage(new File("result.png"));
}
}
-
SourceStringReaderを使うと、Stringのソースを読み込んで画像を生成できる -
generateImage(File)などのメソッドで、指定したファイルに結果を出力できる- 複数の
@startuml...@endumlが存在する場合は、最初の画像だけが生成される
- 複数の
実行結果
> gradle run
...
- コマンドラインから実行する場合と同じで、環境変数
GRAPHVIZ_DOTが設定されている必要がある点に注意
複数画像が定義されている場合
Main.java
package sandbox.plantuml;
import net.sourceforge.plantuml.SourceStringReader;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Main {
public static void main(String[] args) throws Exception {
String source = "@startuml FooBar\n"
+ "Foo <-- Bar\n"
+ "@enduml\n"
+ "\n"
+ "@startuml FizzBuzz\n"
+ "Fizz <-- Buzz\n"
+ "@enduml";
final SourceStringReader reader = new SourceStringReader(source);
try (
OutputStream fooBar = new FileOutputStream("foobar.png");
OutputStream fizzBuzz = new FileOutputStream("fizzbuzz.png");
) {
reader.generateImage(fooBar, 0);
reader.generateImage(fizzBuzz, 1);
}
}
}
-
generateImage(OutputStream, int)を使えば、指定した番号の画像を生成できる - 画像の番号は 0 はじまりで上からの順番
ソースファイルから読み込む
フォルダ構成
|-source.pu
|-build.gradle
`-src/main/java/
`-sandbox/plantuml/
`-Main.java
-
source.puファイルを追加
source.pu
@startuml FooBar
Foo <-- Bar
@enduml
@startuml FizzBuzz
Fizz <-- Buzz
@enduml
- 2つの図を定義している
Main.java
package sandbox.plantuml;
import net.sourceforge.plantuml.SourceFileReader;
import java.io.File;
public class Main {
public static void main(String[] args) throws Exception {
final SourceFileReader reader = new SourceFileReader(new File("source.pu"));
reader.getGeneratedImages();
}
}
-
SourceFileReaderでソースファイルを読み込んでいる -
getGeneratedImages()を実行すると、画像の生成が行われる
実行結果
> gradle run
...
フォルダ構成
|-source.pu
|-FooBar.png
|-FizzBuzz.png
|-build.gradle
`-src/main/java/
`-sandbox/plantuml/
`-Main.java
- コマンドラインから実行したときと同じように、ソースファイルが存在するフォルダに画像が出力される
-
getGeneratedImage()は、生成された画像ファイルを表すFileオブジェクトのListが返される












































































