开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载PlantUML 的vizjs包src/main/java/net/sourceforge/plantuml/vizjs/是项目中负责将图导出到 VizjsGraphViz 的 JavaScript 移植版 布局引擎的桥接层。它通过反射加载纯 Java 的ch.braincell.viz.VizJS封装库内部调用 J2V8 嵌入的 JavaScript 运行时让 PlantUML 在不依赖本机 Graphviz 可执行文件的情况下也能完成 dot 语法到 SVG 输出的布局计算。读完本文你将掌握 vizjs 引擎在 PlantUML 中的定位、核心类的分工、从 DOT 字符串到 SVG 的完整调用链以及如何通过环境变量或皮肤参数显式启用它。一、Vizjs 引擎在 PlantUML 中的定位PlantUML 本身不实现布局算法而是把内部生成的 DOT 描述交给外部布局引擎排版。vizjs是这些引擎中的一种它的特点是纯内嵌实现Vizjs 是 GraphViz 的 JavaScript 移植版源自 mdaines/viz.js而 PlantUML 侧通过 Java 库plantuml/vizjsAndreas Studer 编写内部使用 J2V8 这一 Java 与 JavaScript 之间的高效运行时来调用它无需安装 Graphviz与必须找到dot可执行文件的原生引擎不同vizjs 完全运行在 JVM 内因此特别适合无 Graphviz 的部署环境作为自动回退方案当本机dot不可用时PlantUML 会自动切换到 vizjs。包级别的说明记录在package-info.java中其中明确列出了它的两个上游依赖viz.jsGraphViz 的 JavaScript 移植与 J2V8面向 Java 的高效 JavaScript 运行时。需要说明的是plantuml/plantuml仓库本身不包含这两个上游项目vizjs 目录下只有与 PlantUML 对接的桥接代码真正的 JavaScript 引擎由构建期引入的plantuml/vizjsJava 库提供。二、包结构与核心类vizjs目录规模很小只有 4 个 Java 文件职责非常集中文件职责VizJsEngine.java反射加载并封装ch.braincell.viz.VizJS提供create()与execute(dot)两个底层操作GraphvizJs.java实现 PlantUML 统一的net.sourceforge.plantuml.dot.Graphviz接口管理引擎实例与 DOT→SVG 的执行管线GraphvizJsRuntimeException.java执行期异常的运行时包装向上抛出createFile3中的失败package-info.java包级文档与依赖说明其中GraphvizJs实现了Graphviz接口这意味着它在 PlantUML 的布局引擎体系中与原生dot、Smetana 等处于同一抽象层级可以无缝替换。三、VizJsEngine反射桥接ch.braincell.viz.VizJSVizJsEngine是整个桥接的入口它刻意避免在编译期直接依赖plantuml/vizjs库而是采用反射方式动态加载从而保证在缺少该库的发行版中 PlantUML 依然能正常启动。关键逻辑在VizJsEngine.java的isOk()方法public static boolean isOk() { try { final Class classVizJS Class.forName(ch.braincell.viz.VizJS); return true; } catch (Exception e) { return false; } }探测可用性只要能通过Class.forName找到ch.braincell.viz.VizJS类就认为引擎可用否则返回false。这个探测方法被上层GraphvizRuntimeEnvironment大量调用用于决定是否启用 vizjs延迟实例化构造函数通过反射依次取得create与execute(String)两个方法并缓存到字段中VizJsEngine.javaL55-L61execute(String dot)再把 DOT 文本交给 JS 引擎执行并返回字符串结果通常为 SVG。由于是反射调用VizJsEngine的构造方法声明抛出了一串受检异常ClassNotFoundException、NoSuchMethodException、IllegalAccessException、InvocationTargetException等调用方需要对这些“库缺失/版本不匹配”的情形做容错。四、GraphvizJs从 DOT 字符串到 SVG 的执行管线GraphvizJs是面向 PlantUML 布局框架的门面类承担三件事管理引擎生命周期、执行 DOT→SVG、向框架报告自身能力。4.1 单线程执行器与引擎复用在GraphvizJs.javaL56-L84 中类内部维护了一个newSingleThreadScheduledExecutor线程工厂创建的线程类型是自定义的JsThread。JsThread的run()采用首次使用时才创建引擎的惰性策略第一次执行任务时 new 一个VizJsEngine并保存在线程实例字段中后续任务直接复用避免重复加载 JavaScript 运行时的开销。因为执行器是单线程的引擎实例天然线程安全地串行使用。执行时submitJob()把 DOT 字符串封装成CallableString提交给执行器GraphvizJs.javaL103-L111任务内通过Thread.currentThread()取回JsThread上缓存的引擎并调用engine.execute(dotString)。4.2 createFile3结果写回输出流createFile3(OutputStream os)GraphvizJs.javaL92-L101是Graphviz接口要求实现的核心方法拿到异步任务的返回字符串SVG以字节形式写入输出流并返回ProcessState.TERMINATED_OK()。任何异常都会被包装为GraphvizJsRuntimeException抛出。4.3 能力自述dotVersion 与 GraphvizVersiondotVersion()恒返回字符串VizJsGraphvizJs.javaL117-L119getDotExe()返回null、getExeState()返回ExeState.OK表明它不依赖任何外部可执行文件getGraphvizVersion(boolean modeSafe)GraphvizJs.javaL125-L147返回一个定制的GraphvizVersion实现其中isVizjs()恒为trueuseXLabelInsteadOfLabel()取决于传入的modeSafe参数。这些特性标记会被上层布局代码用来决定标签渲染方式、是否使用盾牌保护、群组链接保护等细节。4.4 构建期裁剪标记文件头部有一行// ::remove folder when __HAXE__注释表示在面向 Haxe/TeaVM 的浏览器端构建中整个 vizjs 目录会被裁剪——因为浏览器环境本身已有 JS 引擎不需要再用 J2V8 嵌入一份。这与src/main/java/gen/readme.md、src/main/java/h/readme.md等由 Smetana 使用的生成代码目录形成互补vizjs 服务于 JVM 环境Smetana 服务于受限环境。五、如何启用 Vizjs 引擎引擎的启用决策集中在GraphvizRuntimeEnvironment.java的useVizJs(ISkinParam)方法L181-L189中满足以下任一条件即启用环境变量/系统属性指定将GRAPHVIZ_DOT设置为字符串vizjs对应源码常量VIZJS vizjsL59。设置方法见GraphvizRuntimeEnvironment.getenvGraphvizDot()它依次读取代码内配置的dotExecutable、JVM 系统属性GRAPHVIZ_DOT、操作系统环境变量GRAPHVIZ_DOT皮肤参数开启skinParam.isUseVizJs()返回true对应 PlantUML 皮肤配置中的 vizjs 相关开关自动回退在create()/createForSystemDot()中L141-L163如果原生引擎Windows 或 Linux 的 dot 包装返回的ExeState不是OK且VizJsEngine.isOk()探测到 JS 库存在则自动降级使用new GraphvizJs(dotString)并在日志中输出Using vizjs与失败原因。使用示例命令行方式# 方式一通过环境变量强制使用 vizjs GRAPHVIZ_DOTvizjs java -jar plantuml.jar -tsvg diagram.puml # 方式二通过 JVM 系统属性 java -DGRAPHVIZ_DOTvizjs -jar plantuml.jar -tsvg diagram.puml需要满足的前提是classpath 中必须包含ch.braincell.viz.VizJS即plantuml/vizjs库及其 J2V8 依赖。若库缺失VizJsEngine.isOk()返回false上述开关不会生效PlantUML 会继续使用原生 dot。启用后运行时会打印版本标识VizJs来自dotVersion()日志中也会出现Using vizjs的提示可通过这些输出确认引擎切换是否成功。六、与其他布局引擎的对比与切换vizjs目录文档的 See also other engines 一节列出了 PlantUML 中并列存在的其他布局引擎它们共同实现了“文本描述 → 图”的能力原生 Graphviz dot见src/main/java/net/sourceforge/plantuml/dot/readme.md通过调用本机安装的dot可执行文件工作功能最完整但依赖系统环境ELKEclipse Layout Kernel见src/main/java/net/sourceforge/plantuml/elk/包通过elk/proxy子包代理 ELK 布局算法SmetanaPlantUML 内嵌的 GraphViz 移植见src/main/java/net/sourceforge/plantuml/sdot/readme.md完全运行在 JVM 内相关的 C 头文件与生成代码分别位于src/main/java/gen/、src/main/java/smetana/core/与src/main/java/h/。从源码结构看vizjs 与 Smetana 在“无需外部可执行文件”这一点上定位相近但实现思路不同Smetana 是把 GraphViz 的 C 算法手工移植为 Java对应smetana/core与gen下的生成代码而 vizjs 是把 GraphViz 编译为 JavaScript 再通过 J2V8 内嵌运行。用户可以根据目标环境是否允许系统安装 Graphviz、是否运行在 JVM、是否有内存/性能约束在这几套引擎间切换共用同一套Graphviz接口切换成本很低。七、小结vizjs包用不足 5 个 Java 文件完成了 PlantUML 与 JavaScript 版 GraphViz 之间的完整桥接VizJsEngine负责反射加载与执行GraphvizJs负责生命周期管理、结果输出和能力自述GraphvizRuntimeEnvironment负责开关决策与自动回退。对于希望“零 Graphviz 依赖”运行 PlantUML 的场景如服务器容器、CI 流水线理解这一引擎的启用条件GRAPHVIZ_DOTvizjs、皮肤参数或自动回退与工作管线能帮助你快速定位布局相关的部署问题。赞分享开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载相关推荐PlantUML sdot 包源码解析Smetana 布局引擎GraphViz 内部移植版的导出实现PlantUML sdot 包源码解析Smetana 布局引擎GraphViz 内部移植版的导出实现 本指南以 PlantUML 仓库中 sdot 包目录开发工具文档LikeC4 布局引擎深度解析likec4/layouts 如何用 Graphviz 将 C4 视图变成可视化布局LikeC4 布局引擎深度解析 likec4/layouts 如何用 Graphviz 将 C4 视图变成可视化布局 导读 likec4/layouts开发工具CLI数据可视化MCP 服务UI组件IceCubesApp的编译依赖图生成Xcode与Graphviz集成IceCubesApp的编译依赖图生成Xcode与Graphviz集成 在SwiftUI开发中项目依赖关系的可视化对于理解代码结构、优化构建流程至关重要。本移动开发社交创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
