Gretty 源码深度剖析:从 Gradle 插件到 Runner 的完整执行链路
Gretty 源码深度剖析从 Gradle 插件到 Runner 的完整执行链路【免费下载链接】grettyAdvanced gradle plugin for running web-apps on jetty and tomcat.项目地址: https://gitcode.com/gh_mirrors/gr/gretty当你在build.gradle里敲下apply plugin: org.akhikhl.gretty再执行一行gradle appRun一个 Jetty 或 Tomcat 容器便神奇地启动起来浏览器自动弹出你的 Web 应用。Gretty正是这样一个高级 Gradle 插件它把构建 Web 应用并在 Jetty/Tomcat 上运行这件事简化到了极致。但这一行命令背后到底发生了什么从Gradle 插件注册任务、到DefaultLauncher拉起独立 JVM、再到Runner进程里启动 Servlet 容器是一条设计精巧的完整执行链路。本文将从源码角度把这条链路从头到尾拆给你看帮助你真正理解 Gretty 的运行机制。一、Gretty 源码整体架构三个关键层次 ️在深入执行链路之前先认识 Gretty 的源码布局。克隆仓库后核心代码集中在libs/目录下可以分成三个层次层次模块职责Gradle 插件层libs/gretty/与 Gradle 深度耦合注册任务、扩展、配置、依赖桥接层libs/gretty-core/、libs/gretty-runner/进程启动、端口协商、服务协议、Runner 主类容器适配层gretty-runner-jetty7/8/9/93/94、gretty-runner-tomcat/7/8针对不同 Servlet 容器实现ServerManager这种分层设计非常巧妙Gradle 插件层libs/gretty只负责与构建系统交互容器适配层完全独立于 Gradle甚至可以直接复用。理解了这三个层次整条执行链路就清晰了一半。二、执行链路总览一次 appRun 的完整旅程 一次gradle appRun的完整执行大致经历以下五个阶段插件入口GrettyPlugin.apply()注册扩展与任务任务执行AppStartTask组装配置构造DefaultLauncher进程拉起LauncherBase协商端口通过javaexec启动 Runner 子进程服务循环Runner主进程监听命令调用ServerManager启动容器交互控制Gradle 侧监听按键向 Runner 发送 restart/stop 指令下面我们逐个阶段深入剖析。三、第一阶段插件入口 —— GrettyPlugin 干了什么 一切从GrettyPlugin开始它是整个插件的总开关源码位于 GrettyPlugin.groovy。它的apply()方法主要做了四件事1. 注册扩展DSLproject.extensions.create(gretty, GrettyExtension) project.extensions.create(farm, FarmExtension, project) project.extensions.create(product, ProductExtension)这就是你能在build.gradle里写gretty { ... }、farm { ... }配置块的来源。2. 批量注册任务在addTasks()方法中插件一口气注册了几十个任务appRun、appStart、appStop、appRestart、jettyRun、tomcatRun以及各自的 Debug 变体如appRunDebug还有集成测试配套的appBeforeIntegrationTest/appAfterIntegrationTest。3. 建立任务依赖在addTaskDependencies()中appRun会依赖prepareInplaceWebApp或prepareArchiveWebApp确保启动前 Web 应用资源已准备就绪。4. 注入依赖配置插件还会为 Spring Boot 项目自动排除内嵌 Tomcat/Jetty避免与 Gretty 管理的容器冲突这正是 Gretty 能优雅支持 Spring Boot 的关键细节。小知识GrettyStartTask类已标记Deprecated建议直接使用AppStartTask源码见 GrettyStartTask.groovy。四、第二阶段任务执行 —— StartBaseTask 的模板方法 运行appRun时实际执行的是AppStartTask继承自StartBaseTask。StartBaseTask是一个经典的模板方法模式实现源码见 StartBaseTask.groovy。它的核心是TaskAction action()方法LauncherConfig config getLauncherConfig() Launcher launcher new DefaultLauncher(project, config) launcher.scannerManager createScannerManager(config, ...) launcher.launch()而AppStartTask.getStartConfig()见 AppStartTask.groovy负责把 DSL 配置、项目默认值、命令行参数合并成最终的ServerConfig和WebAppConfig并调用doPrepareServerConfig()处理证书生成、Jacoco 参数注入、SpringLoaded 热加载 agent 等细节。五、第三阶段进程拉起 —— LauncherBase 与端口协商 DefaultLauncher继承了LauncherBase源码在 LauncherBase.groovy这里藏着两个重要机制1. 端口协商beforeLaunch()会先检查build/gretty_ports属性文件判断服务器是否已在运行如果未运行则通过findFreePorts()分配两个空闲端口servicePort服务端口用于接收命令和statusPort状态端口用于回报启动状态并写入属性文件。2. 启动子进程launchThread()中会构造JavaExecParams以org.akhikhl.gretty.Runner为主类通过javaexec在独立的 JVM 进程中启动服务器params.main org.akhikhl.gretty.Runner params.args [ --servicePort${servicePort}, --statusPort${statusPort}, --serverManagerFactory${getServerManagerFactory()} ]设计亮点服务器运行在独立进程中与 Gradle 守护进程隔离。即使 Gradle 任务结束服务器也能存活这也是appStart非交互模式能后台常驻的原因。六、第四阶段Runner 主进程 —— 命令驱动的服务循环 Runner是独立 JVM 的入口源码见 Runner.groovy它的main()解析三个命令行参数后进入一个死循环创建ServerSocket监听servicePort并向 Gradle 侧发送init信号循环读取 Gradle 侧发来的 JSON 命令首次收到配置后加载 logback 日志配置调用ServerManager.startServer()之后根据命令响应status返回启动状态、stop停止服务器并退出、restart重启容器、redeploy xxx热部署指定 Web 应用这个机制让Gradle 任务已退出、服务器仍在运行成为可能服务器启动后appRun的交互循环只是不停读取键盘输入并把按键翻译成restartWithEvent等命令发给 Runner。七、第五阶段ServerManager —— 容器适配层的抽象 ServerManager是容器适配层的核心接口ServerManager.groovy只定义四个方法setParams()—— 注入运行参数startServer()—— 启动容器stopServer()—— 停止容器redeploy()—— 热部署指定应用每个容器版本提供自己的实现gretty-runner-jetty9、gretty-runner-jetty94负责 Jetty 各版本gretty-runner-tomcat8等负责 Tomcat。Runner 通过Class.forName(params.serverManagerFactory)反射加载对应的工厂类从而与具体容器解耦。这种一个 Runner 多个 ServerManager 实现的架构让 Gretty 只需一份命令协议就能无缝支持 Jetty 7/8/9/9.3/9.4 与 Tomcat 7/8 全家桶。八、热部署与自动重启的秘密Scanner 机制 执行链路之外Gretty 最受好评的热部署功能也值得一看。StartBaseTask的createScannerManager()支持两种扫描器源码见 scanner/JDKScannerManager.groovy 和 JettyScannerManager.groovyJDK 扫描器基于WatchService性能更高优先使用Jetty 扫描器作为 JDK 扫描器不可用时的降级方案当扫描器检测到 class 或资源变化时会通过asyncResponse向 Runner 发送restartWithEvent命令并等待完成事件实现优雅的热重启。若开启了 Spring Loaded 的managedClassReload还能实现类级别的热替换。九、进阶场景Farm 多应用集群与集成测试 如果你有多个 Web 应用需要同时运行Gretty 的Farm机制会派出用场。GrettyPlugin.addTasks()会为每个 farm 生成farmRun、farmStart、farmStop等一系列任务在同一个容器中部署多个应用。此外appBeforeIntegrationTest/appAfterIntegrationTest任务与integrationTest任务配合可以在测试前自动启动服务器、测试后自动关闭——配合integrationTests/目录下的大量示例如 farm/、helloGretty/你可以快速学会各种场景的用法。十、总结一次点击背后的精妙设计 回看整条链路Gradle 插件注册任务 → 任务组装配置 → Launcher 协商端口 → 独立 JVM 中的 Runner 循环 → ServerManager 启动容器 → Scanner 驱动热部署。Gretty 的成功源于两个关键决策进程隔离服务器跑在独立 JVM 中与 Gradle 生命周期解耦协议抽象统一的服务协议 可插拔的容器适配层一份命令通吃所有容器希望这篇 Gretty 源码剖析能帮你建立起从 Gradle 插件到 Runner 的完整认知。下次运行gradle appRun时你就能清楚地知道屏幕背后那条精心设计的执行链路正在如何为你工作。如果想亲手验证可以用git clone https://gitcode.com/gh_mirrors/gr/gretty拉取源码边读边调试收获会更大。【免费下载链接】grettyAdvanced gradle plugin for running web-apps on jetty and tomcat.项目地址: https://gitcode.com/gh_mirrors/gr/gretty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Windows UAC拦截问题全解析:从解除锁定到组策略配置

Windows UAC拦截问题全解析:从解除锁定到组策略配置

1. 问题现象与根源剖析 “为了对电脑进行保护,已阻止此应用”这个弹窗,对于经常在Windows系统上安装软件的朋友来说,绝对是个“老熟人”。它通常在你双击一个从网上下载的.exe或.msi安装程序时突然蹦出来,像个尽职尽责的保安&…

2026/11/1 22:10:34 阅读更多 →
MPTCPv1调度器实现与性能优化指南

MPTCPv1调度器实现与性能优化指南

1. MPTCPv1调度器概述 多路径TCP(MPTCP)作为传统TCP协议的扩展,允许单个TCP连接同时使用多条网络路径传输数据。我在内核4.15版本上实现MPTCPv1调度器时,发现其核心价值在于:当设备同时连接Wi-Fi和蜂窝网络时&#xff…

2026/10/25 12:12:17 阅读更多 →
如何用 PolicyPlus 在 Windows 家庭版上打开组策略编辑器:零门槛上手指南

如何用 PolicyPlus 在 Windows 家庭版上打开组策略编辑器:零门槛上手指南

如何用 PolicyPlus 在 Windows 家庭版上打开组策略编辑器:零门槛上手指南 【免费下载链接】PolicyPlus Local Group Policy Editor plus more, for all Windows editions 项目地址: https://gitcode.com/gh_mirrors/po/PolicyPlus 你刚买的新电脑预装的是家庭…

2026/11/1 0:27:39 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/1 0:24:43 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/1 10:36:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/1 10:36:51 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/1 1:06:58 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/1 10:35:11 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/1 9:35:41 阅读更多 →

日新闻

周新闻

月新闻