CentOS7でPlantUMLのレイアウトが上手く制御できない
CentOS7でPlantUMLサーバを立ち上げて見たのですが,ユースケース図やクラス図の配置が上手く制御できませんでした. 結論としてGraphvizのバージョンを上げることで解決できました.
制御が正しく機能しない例
PlantUMLでは,要素間の関係にleft
, right
, up
, down
を指定することで要素間の位置関係をコントロールできます.
例えば,以下のコードをPlantUML Web Serverでコンパイルすると次の図が生成されます.
@startuml A -up- A1 A -right- A2 A -down- A3 A -left- A4 @enduml
しかし,CentOS7で立ち上げたPlantUMLサーバでは同じコードでも以下の図が生成されてしまいました.
どうやら,left
とright
が正しく動作していないようです.A - A2
のように関係に一つのハイフンを使った場合も同様です(ハイフン一つだと-right-
と同じ意味になります).
環境の確認
公式のサーバと自前のCentOS7環境で出力結果が異なる原因を探るため,動作環境の確認をしました. 以下のコードでPlantUMLとGraphvizのバージョンを確認できます.
@startuml version @enduml
以下の表に確認結果を載せます.
自前環境 | 公式サーバ | |
---|---|---|
PlantUML | 1.2019.06 | 1.2019.08 |
Graphviz | 2.30.1 | 2.38.0 |
JRE | 1.8.0 | 1.7.0 |
自前環境ではPlantUMLとGraphvizのバージョンが古いことがわかりました. PlantUMLはMavenでインストールしたものを,GraphvizとJREはCentOS7のデフォルトのリポジトリからインストールしたものを使っていました.
まず,PlantUMLのバージョンを1.2019.08に更新してみましたが結果は変わりませんでした. なので,次にGraphvizを更新してみました.
Graphvizの更新
CentOS7のデフォルトのリポジトリには2.30.1しかありません. Googleで検索すると,過去にGraphvizの公式がRHEL用のGraphvizのリポジトリを提供していたようですが,現在はリポジトリの定義ファイルはリンク切れになっていました. なので,ソースコードから自前でビルドすることにしました.Graphvizの公式ダウンロードページからは2.40.1のソースしかダウンロードできず,PlantUMLのFAQには2.40では問題が出る可能性があると書いてあるので,GtiLabからソースを持ってきました.
# ソースコードをクローン git clone https://gitlab.com/graphviz/graphviz.git # tagがないのでログで2.38のコミットハッシュを検索してcheckout cd graphviz git checkout -b v2.38 f54ac2c # PlantUMLの連携にlibexpatが必要 (FAQ参照) sudo yum install expat-devel # Graphviz公式ページ記載の手順でビルド.今回は/opt/graphvizにインストールする ./autogen ./configure --prefix=/opt/graphviz make sudo make install
あとは,PlantUMLサーバがアップデートしたGraphvizを使うようにすれば完了です.
mvn jetty:run -DGRAPHVIZ_DOT=/opt/graphviz/bin/dot
この状態で,問題となったコードをコンパイルすると公式と同じ結果を出力できるようになりました.
まとめ
CentOS7のGraphvizは古いのでPlantUMLが期待通りの結果を出力してくれません. Graphvizを自前でビルドしてバージョンアップするか,CentOS以外のOSを使ってやるとよいです.