あめだまふぁくとりー

Boost.Graphとかできますん

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

f:id:amedama41:20190720095046p:plain
出力例(正しいレイアウト)

しかし,CentOS7で立ち上げたPlantUMLサーバでは同じコードでも以下の図が生成されてしまいました.

f:id:amedama41:20190720095606p:plain
出力例(誤ったレイアウト)

どうやら,leftrightが正しく動作していないようです.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でインストールしたものを,GraphvizJREは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を使ってやるとよいです.