java代码如下:
引入
<dependency>
<groupId>net.sourceforge.plantuml</groupId>
<artifactId>plantuml</artifactId>
<version>1.2023.4</version>
</dependency>
代码实现:
public String getPictureSvg(String uml, FileFormat format) throws IOException {
String svgCode;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
SourceStringReader sourceReader = new SourceStringReader(uml);
sourceReader.outputImage(
outputStream, new FileFormatOption(format));
svgCode = outputStream.toString(StandardCharsets.UTF_8);
}
return svgCode;
}
根据uml代码使用java实现可以得到base64的字符串,使用字符串通过image/svg+xml格式返回给前端即可得到如下svg的图形
uml代码块:
@startuml
!include <C4/C4_Container>
LAYOUT_TOP_DOWN()
AddElementTag("domain", $fontColor="#FF8000", $bgColor="#CEFAE7")
AddRelTag("DashedLine", $textColor=$ARROW_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DashedLine())
AddRelTag("DottedLine", $textColor=$ARROW_COLOR, $lineColor=$ARROW_COLOR, $lineStyle=DottedLine())
title 小程序电商系统模板
!include <logos/rocket-chat>
!include <logos/java>
!include <cloudinsight/java>
!include <cloudinsight/java>
!include <cloudinsight/mysql>
System_Boundary("0725_1","小程序电商系统"){
Container("0725_2","微信小程序","min","用户交互的小程序前端",$sprite=rocket-chat)
Container("0725_3","订单微服务","Java、SpringCloud、Tomcat","下单、订单的业务逻辑",$sprite=java)
Container("0725_4","商城微服务","Java、SpringCloud、Tomcat","商品浏览、详情的业务逻辑",$sprite=java)
Container("0725_5","小程序微服务","Java、SpringCloud、Tomcat","微信授权、推送等业务逻辑",$sprite=java)
Container("0725_6","数据库","mysql","RDBMS数据库",$sprite=mysql)
}
Person("0725_7","用户","小程序电商系统的潜在用户")
System_Ext("0725_8","微信公众平台","提供用户授权、支付、推送等功能")
System_Ext("0725_9","电商中台","提供商品中台、库存中台、物流中台、订单中台等中台能力")
Rel("0725_2","0725_3","调用","https","")
Rel("0725_2","0725_4","调用","https","")
Rel("0725_3","0725_5","调用","rpc","")
Rel("0725_4","0725_5","调用","rpc","")
Rel("0725_5","0725_6","读/写","","")
Rel_R("0725_7","0725_2","使用","","")
Rel_U("0725_8","0725_7","交互","","")
Rel_R("0725_4","0725_9","调用","rpc","")
Rel("0725_5","0725_8","交互","https","")
Rel("0725_3","0725_6","读/写","","")
Rel("0725_4","0725_6","读/写","","")
Rel("0725_3","0725_9","调用","rpc","")
SHOW_LEGEND()
@enduml
得到的结果:
一切都是正常的,但是部署到linux系统会发现图形是这样的:
C4图形设置的Rel_R(箭头指向右),Rel_U(箭头指向上)失效了,最后发现plantuml底层实际是通过graphviz渲染出来的
可以通过uml测试:
@startuml
testdot
@enduml
得到windows系统的版本是
而我部署的linux系统centos里graphviz版本是2.30.1
由于graphviz版本的不同导致Rel_R,Rel_U失效,发现问题解决起来就简单了
重新打个镜像部署个高于2.38.0的即可,我这边使用的是2.46.0
graphviz-2.46.0.tar.zg下载包地址如下:
https://gitlab.com/graphviz/graphviz/-/package_files/6163716/download
下载其他版本可以在此地址下载:
Dockefile如下:
FROM xxx.xxx.xx.xx/base/java-jdk11:v1.0.0(一个基础镜像)
ADD graphviz-2.46.0.tar.gz /usr/local/src
RUN cd /usr/local/src/graphviz-2.46.0 && ./configure && make && make install \
&& yum -y groupinstall fonts
重新打包镜像部署项目后就可以了!