开发工具文档【免费下载链接】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),仅供参考
企业数字化 ERP 产品动态
相关推荐
无 root 权限下 opencode 安装与 TaoToken 配置实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 1:56:52
白中英《计算机组成原理》第六版课后题实战解析 简介:本资源是白中英《计算机组成原理》(第六版)配套课后习题的完整参考答案,面向计算机类本科生、考研备考学生及自学者,专为解决教材习题无标准解析、自学难验证、复习缺抓手等痛点而整理。答案覆盖全书10大核心模块… · 2026/9/23 1:56:46
Pand底层原理揭秘:新手避坑指南,面试不再卡壳 Pand底层原理揭秘:新手避坑指南,面试不再卡壳 面试被问到底层机制,大脑一片空白?这是很多后端开发新手的噩梦。特别是在处理高并发或数据同步场景时,面试官抛出关于数据一致性的追问,如果你只能背诵概念,无法结合源码或实际运行逻辑进行拆解,基本… · 2026/9/23 1:56:46
Innovus 21.13数字IC后端实战指南:从物理约束到签核闭环 简介:本资源为Cadence官方发布的《Innovus用户指南》21.13版(2022年2月更新),面向数字IC后端设计工程师、高校EDA方向研究者及集成电路设计进阶学习者,系统解决物理布局、时序收敛、功耗优化等关键实现环节的操作与调试… · 2026/9/23 11:46:26
CompactPCI R3.0规范:工业硬件互操作的物理层权威依据 简介:本资源为PICMG组织发布的CompactPCI核心规范中文译版(修订版3.0),面向工业控制、嵌入式系统及高可靠性计算领域的硬件工程师、板卡设计人员与系统集成开发者,解决CompactPCI架构下板卡兼容性设计、热插拔实现与系… · 2026/9/23 11:46:20
2026最新GridFS底层原理图解,彻底搞懂大文件存储 2026最新GridFS底层原理图解,彻底搞懂大文件存储 翻遍MongoDB官方文档,关于GridFS的章节动辄几十页,全是API调用和配置参数,却极少有人把“它到底怎么把一个大文件切碎了塞进数据库”这个核心动作讲透。很多开发者以为Grid… · 2026/9/23 11:46:14
GL3510 USB 3.0 Hub原理图验证与PCB设计要点解析 简介:GL3510原理图-已验证,是一份经过实际验证的USB 3.1 Gen1 4-Port HUB控制器(QFN64封装)电路设计PDF,适用于硬件工程师、PCB Layout工程师和嵌入式开发人员在产品研发、方案评估或硬件调试时直接对照参考。该PDF包含… · 2026/9/23 11:46:14
三角函数公式太多记不住?用单位圆和推导逻辑一网打尽 做了这么多年数学辅导,被问得最多的一个问题永远是:“三角函数公式这么多,到底怎么记?”每次听到这个问题,我都想先反问一句:你记公式是为了背,还是为了用?如果是纯粹为了背… · 2026/9/23 11:46:07
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29