PlantUML使い方メモ

長くなるので、図の書き方はクラス図とシーケンス図だけで。

PlantUML とは

環境構築

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 の場所を指定する必要がある。
指定方法は次のいずれか(採用される優先度が高いモノ順に並べている)。

  1. -graphvizdot オプションで指定する
  2. システムプロパティ GRAPHVIZ_DOT で指定する
  3. 環境変数 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 がある場合は、現在カーソルが存在する場所の図がプレビューされる

plantuml.jpg

Markdown Preview Enhanced

Markdown Preview Enhanced - Visual Studio Marketplace

  • Markdown 中の PlantUML をプレビューできるようにするプラグイン
  • Ctrl + k, v でプレビューが表示される

plantuml.jpg

Hello World

hello.pu
@startuml
Hello <|-- World
@enduml
  • テキストファイルを作って、中身を↑のように記述する
  • ファイルの拡張子は pu が慣例?
実行
> java -jar plantuml.jar hello.pu
  • 引数に作成したテキストファイルを指定して実行する
  • すると、引数で指定したファイルと同じ場所に hello.png というファイルが出力される

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.pngJavaSource.png が生成されている

plantuml.png

plantuml.png

JavaSource.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.pngfuga.png も生成されている

markdown.png

mardown.png

fuga.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.png

hoge_001.png

hoge_001.png

hoge_002.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

hoge.png

fuga.png

fuga.png

pioy.png

piyo.png

  • @startuml 名前 とすることで、図ごとのファイル名を指定できる

ヘルプの表示

> java -jar plantuml.jar -h
  • ヘルプは、 -h または -help で表示できる

共通

コメント

@startuml no-scale
' これはコメント
Hello <|-- World
@enduml
  • シングルクォーテーション (') から後ろはコメント扱いになる

タイトル

@startuml
title Hello Title
Hello <|-- World
@enduml

hoge.png

  • title タイトル と記述することで、図のタイトルを設定できる

複数行のタイトル

@startuml
title
Hello
Title
end title
Hello <|-- World
@enduml

hoge.png

  • titleend title で囲うことで、複数行のタイトルが記述できる

マークアップ言語で書く

@startuml
title
* __Hello__
* **World**
end title
Hello <|-- World
@enduml

hoge.png

キャプション

@startuml
caption 図1
Hello <|-- World
@enduml

hoge.png

  • caption キャプション で、図のキャプションを設定できる

ヘッダー・フッター

@startuml
header Hello
Hello <|-- World
footer World
@enduml

hoge.png

  • header ヘッダーコメント, footer フッターコメント で、ヘッダーとフッターを指定できる
  • デフォルトだと、ヘッダーは右寄せ、フッターはセンタリングになる
  • Creole で記述できる

位置を指定する

@startuml
left header Hello
Hello <|-- World
right footer World
@enduml

hoge.png

  • left, center, rightheader, footer の前に記述することで、位置を調整できる

複数行で書く

@startuml
header
Hello
Header
end header

Hello <|-- World

footer
World
Footer
end footer
@enduml

hoge.png

  • header ... end header, footer ... end footer で囲むことで、複数行で記述できる

凡例

@startuml
legend
Hello World
end legend

Hello <|-- World
class FizzBuzz
@enduml

hoge.png

  • legend ... end legend で、凡例を挿入できる
  • デフォルトでは、中央下に配置される

位置を指定する

  • legend の後ろに上下の位置 (top, bottom) と左右の位置 (left, center, right) を指定できる
@startuml right
legend right
Right
end legend

Hello <|-- World
class FizzBuzz
@enduml

right.png

  • 左右の位置だけ指定した場合、上下の位置はデフォルトの bottom になる
@startuml top
legend top
Top
end legend

Hello <|-- World
class FizzBuzz
@enduml

top.png

  • 上下の位置だけ指定した場合、左右の位置はデフォルトの center になる
@startuml top-left
legend top left
Top Left
end legend

Hello <|-- World
class FizzBuzz
@enduml

top-left.png

  • 両方とも指定した場合は、指定された位置に表示される
  • このとき、 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

plantuml.jpg

  • 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

hoge.png

フォントを指定する

@startuml
skinparam DefaultFontName メイリオ
おはよう <|-- 世界
@enduml

hoge.png

  • skinparam DefaultFontName フォント名 と記述することで、デフォルトのフォントを指定できる
  • skinparam は、 skinparam <key> <value> という書式で様々なスキン設定を指定できる
  • DefaultFontName はデフォルトのフォントを指定するキー
  • CaptionFontNameClassFontName のように、特定の要素ごとにフォントを指定することも可能
  • <key> に指定できる値の一覧は、次のコマンドで確認できる
> java -jar plantuml.jar -language
...
;skinparameter
;536
ActivityBackgroundColor
ActivityBarColor
ActivityBorderColor
ActivityBorderThickness
ActivityDiamondBackgroundColor
ActivityDiamondBorderColor
ActivityDiamondFontColor
...

クラス図

クラスを宣言する

@startuml
class Hello
class World
@enduml

hoge.png

  • class <型名> と記述することで、クラスを宣言できる

インターフェースを宣言する

@startuml
interface Hello
interface World
@enduml

hoge.png

  • interface <型名> と記述することで、インターフェースを宣言できる

抽象クラスを宣言する

@startuml
abstract class Hello
@enduml

hoge.png

  • abstract class <型名> とすることで、抽象クラスを宣言できる

enum を宣言する

@startuml
enum HelloWorld {
    ONE
    TWO
    THREE
}
@enduml

hoge.png

  • enum <型名> で、 enum を宣言できる
  • 続けて波括弧 {...} を書き、そのなかで定数を宣言できる

型間の関連を記述する

関連(リンク)

@startuml
Hello -- World
@enduml

hoge.png

  • <型名> <関連を表す線> <型名> と記述することで、型間の関連を記述できる
  • -- は、単純な関連だけを記述できる
  • class <型名> で宣言していない型でも使用可能
    • 宣言と合わせて記述することも可能

誘導可能性の表現

@startuml
class One
One --> Two
Three <-- Four
Five <--> Six
Seven x-- Eight
Nine --x Ten
@enduml

hoge.png

  • <, >, x で、誘導可能性を表現できる

依存

@startuml
One ..> Two
Three <.. Four
@enduml

hoge.png

  • ..>, <.. で、依存を表現できる

汎化

@startuml
One --|> Two
Three <|-- Four
@enduml

hoge.png

  • <|--, --|> で、汎化を表現できる

実現

@startuml
One ..|> Two
Three <|.. Four
@enduml

hoge.png

  • ..|>, <|.. で、実現を表現できる

集約

@startuml
One --o Two
Three o-- Four
@enduml

hoge.png

  • --o, o-- で、集約を表現できる

コンポジション

@startuml
One --* Two
Three *-- Four
@enduml

hoge.png

  • --*, *-- で、コンポジションを表現できる

関連名

@startuml
One -- Two : Hoge
Three -- Four : Fuga >
Five -- Six : < Piyo
@enduml

hoge.png

  • 関連を記述した後ろに : を入れると、そのさらに後ろに関連名を記述できる
  • 関連名の前後に <, > を入れることで、関連の方向性を表現できる

ロール名と多重度

@startuml
One "Foo" -- Two 
Three -- "Bar" Four
Five "1" -- "1..*" Six
Seven "1 Fizz" -- "~* Buzz" Eight
@enduml

hoge.png

  • 型名と関連の線の間にダブルクォーテーション (") で囲った文字列を記述することで、ロール名または多重度を記述できる
  • ロール名用・多重度用に記述が分かれておらず、この記法をうまく利用して両方を記述しなければならないっぽい
  • なお、 * Buzz のようにアスタリスク (*) で始めてしまうと Creole 記法のリスト扱いになってしまうので、 ~ でエスケープする必要がある

フィールド・メソッドの定義

@startuml
class Hello {
    one: String
    three(param1: String, param2: int): boolean
    String two
    int four(List<String> param)
}
@enduml

hoge.png

  • class <型名> の後に波括弧 ({...}) で囲った中で、フィールドやメソッドを宣言できる
  • UML として正式な記述 (フィールド名: 型名) だけでなく、 Java 的な書き方 (型名 フィールド名) でも書ける
    • 結構なんでも書けるっぽいが、 UML の正式な記法にしておくのが無難だとは思う
  • フィールドとメソッドは自動的に判定されて、よしなにクラス図のそれぞれの部分に描画される
    • こちらも、あえて混在させる必要はなく、キレイに分けて書いておいたほうが無難

可視性

@startuml
class Hello {
    - privateField: int
    # protectedField: int
    ~ packagePrivateField: int
    + publicField: int

    - privateMethod(): void
    # protectedMethod(): void
    ~ packagePrivateMethod(): void
    + publicMethod(): void
}
@enduml

hoge.png

  • UML の記法で可視性を記述すると専用のアイコン表示になる
  • 逆に分かりにくいって場合は、以下の様にしてアイコン表示をオフにすることもできる
@startuml
skinparam classAttributeIconSize 0
class Hello {
    - privateField: int
    # protectedField: int
    ~ packagePrivateField: int
    + publicField: int

    - privateMethod(): void
    # protectedMethod(): void
    ~ packagePrivateMethod(): void
    + publicMethod(): void
}
@enduml

hoge.png

  • skinparam classAttributeIconSize 0 を設定すると、可視性のアイコン表示は消える

抽象メンバー

@startuml
class Hello {
    {abstract} one: int
    {abstract} two(): int
}
@enduml

hoge.png

  • メンバーの先頭に {abstract} とつけることで、抽象メンバーにできる

静的メンバー

@startuml
class Hello {
    {static} ONE: int
    {static} two(): int
}
@enduml

hoge.png

  • メンバーの先頭に {static} とつけることで、静的メンバーにできる

ステレオタイプ

@startuml
class Hello <<Hoge>>
class World <<Fuga>> {
    message: String
}
@enduml

hoge.png

  • 型名の後ろに <<ステレオタイプ>> と記述することで、ステレオタイプを記述できる

テンプレート

@startuml
class Hello<H>
class World<W> <<Hoge>>
@enduml

hoge.png

  • 型名の直後に <名前> と記述することで、テンプレートを表現できる
  • ステレオタイプとの併用も可能

実現や汎化を 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

hoge.png

  • extendsimplements を使って、まんま Java コードっぽく書ける
  • これは捗る

パッケージ

@startuml
package one.two {
    class Hello
}

package three.four {
    World -- Hello
}
@enduml

hoge.png

  • package <名前> {...} と記述することで、パッケージを表現できる
  • 波括弧の中では、クラスや関連を記述できる

宣言の順序に注意

パッケージ宣言の順序を逆転した場合
@startuml
package three.four {
    World -- Hello
}

package one.two {
    class Hello
}
@enduml

hoge.png

  • 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

hoge.png

  • クラスなどの宣言のうしろに note <top|bottom|left|right>: <コメント> と記述することで、直前の要素にたいしてノートを記述できる
  • Creole での記述も可能

ノートをつける要素を指定する

@startuml
Fizz -- Buzz
note left of Fizz: fizz
note right of Buzz: buzz
@enduml

hoge.png

  • note <位置> of <対象>: <コメント> と記述することで、 <対象> で指定した要素に対してノートをつけることができる

関連にノートをつける

@startuml
Fizz -- Buzz
note on link: fizz-buzz
note left: buzz
@enduml

hoge.png

  • 型間の関連を記述したあとに note on link: <コメント> と記述することで、関連に対してノートをつけることができる

ノートに名前をつける

@startuml
note "Hello World" as n1
Hello -- n1
World .. n1

note "Fizz Buzz" as n2
@enduml

hoge.png

  • 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

hoge.png

  • 各ノートの記法は、 end note で終わらせることで複数行で書くことが可能

シーケンス図

同期メッセージ

@startuml
Alice -> Bob: Hi
Bob --> Alice: Hi

Alice -> Bob: Is this a pen?
Bob --> Alice: No! This is an apple!!
@enduml

hoge.png

  • シーケンス図は、基本的に <要素> <メッセージ> <要素>: <メッセージ名> と記述していく
  • <メッセージ> は、 -> で同期メッセージになる
  • --> は線が点線になり、応答メッセージに使用できる

非同期メッセージ

@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

hoge.png

  • ->> と記述することで、非同期メッセージを表現できる

ライフラインの並び順を指定する

@startuml
participant Alice
participant Bob
participant Carol

Carol -> Bob: Is the tip included?
Bob -> Alice: いずれテッペン超えれる?
@enduml

hoge.png

  • 何もしないと、ライフラインは上から現れた順番で、左から並べられる
  • ライフラインの順序を指定したい場合は、 paritcipant <ライフラインの名前> という形で別途並びを定義しておく

ライフラインにアイコンを使う

@startuml
actor Actor
boundary Boundary
control Control
entity Entity
database Database
collections Collections
@enduml

hoge.png

  • participant の代わりに特定のキーワードを指定することで、役割に合わせたアイコンを使用できる

自分自身へのメッセージ

@startuml
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
Aclie -> Aclie: 逃げちゃ駄目だ
@enduml

hoge.png

  • 自分自身にメッセージを送ることもできる

メッセージに番号を振る

@startuml
Alice -> Bob: Hi
autonumber
Bob -> Carol: Hi
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml

hoge.png

  • メッセージの前に autonumber と記述することで、その後のメッセージに自動的に番号を振ることができる

開始番号と増分を指定する

@startuml
autonumber 3
Alice -> Bob: Hi
Bob -> Carol: Hi
autonumber 2 3
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml

hoge.png

  • autonumber <開始> <増分> のようにして、開始番号と増分を指定できる

自動採番の一時停止・再開

@startuml
autonumber
Alice -> Bob: Hi
autonumber stop
Bob -> Carol: Hi
Carol -> Dave: Hi
autonumber resume
Bob -> Dave: Hi
Carol -> Dave: Hi
@enduml

hoge.png

  • 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

hoge.png

  • 特定のキーワードを使うことでメッセージをグループ化できる
  • 使用できる予約済みのキーワードは以下
    • alt/else
    • opt
    • loop
    • par
    • break
    • critical
  • キーワードの後ろに任意の文字列を記述できる(分岐の条件などを記述できる)
  • インデントは必要ないが、しておいたほうが見やすいと思う
  • グループは次のように入れ子が可能
入れ子にした場合
@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

hoge.png

任意の名前のグループを作る

@startuml
group コピペ
    Alice -> Bob: Is this a pen?
    Alice <-- Bob: No! This is an apple!!
end
@enduml

hoge.png

  • group <名前> とすることで、任意の名前のグループを書ける
  • この場合、 alt などでかけたような条件に当たるところの記述はできない

実行仕様

@startuml
activate Alice
Alice -> Bob

activate Bob
Bob -> Carol

activate Carol
Bob <-- Carol

deactivate Carol
Alice <-- Bob

deactivate Bob
@enduml

hoge.png

  • 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

hoge.png

  • 実行仕様は入れ子にできる

ライフラインの生成

@startuml
Alice -> Bob
create Carol
Bob -> Carol: new
Bob -> Carol
Bob <-- Carol
Alice <-- Bob
@enduml

hoge.png

  • create <名前> と記述することで、指定した名前のライフラインを途中から生成できる

リファレンス

@startuml
Alice -> Bob
ref over Bob, Carol: あっちを参照
Alice <-- Bob
ref over Alice
そっちを
参照
end ref
@enduml

hoge.png

  • ref over <リファレンスで囲う対象>: <説明> と記述することで、リファレンスを記述できる
  • リファレンスで囲う対象には、ライフラインの名前をカンマ区切りで複数指定できる
  • ref over ... end ref とすることで複数行で記述することも可能

境界線

@startuml
== Foo ==
Alice -> Bob
Alice <-- Bob

== Bar ==
Bob -> Carol
Bob <-- Carol
@enduml

hoge.png

  • == <名前> == と書くことで、境界線を記述できる

外部からの(への)メッセージ

@startuml
[-> Alice: Hello
Alice ->]: Hello
@enduml

hoge.png

  • ライフラインの名前の代わりに [, ] を使うことで、外部からの(への)メッセージを記述できる

メッセージの間に間隔をあける

@startuml
Alice -> Bob
Alice <-- Bob

Alice -> Bob
Alice <-- Bob
|||
Alice -> Bob
Alice <-- Bob
||80||
Alice -> Bob
Alice <-- Bob
@enduml

hoge.png

  • メッセージの間に ||| を挟むことで、少し間隔をあけることができる
  • ||<ピクセル>|| とすれば、間隔の大きさをピクセルで指定できる

ノート

@startuml
Alice -> Bob
note left: Hello
Alice <-- Bob
note right: World
Alice -> Alice
note left
Hello
World
end note
@enduml

hoge.png

  • メッセージの直後に 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"
}

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
...

result.png

  • コマンドラインから実行する場合と同じで、環境変数 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

FooBar.png
FooBar.png

FizzBuzz.png
FizzBuzz.png

  • コマンドラインから実行したときと同じように、ソースファイルが存在するフォルダに画像が出力される
  • getGeneratedImage() は、生成された画像ファイルを表す File オブジェクトの List が返される

参考

opengl-8080
ただのSE。Java好き。
tis
創業40年超のSIerです。
https://www.tis.co.jp/
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。