vscode-drawio扩展版本迁移:从旧版到新版的平滑过渡
Gretty 多模块项目实战:Gradle 多项目下如何优雅集成
Gretty 是一款功能强大的 Gradle 插件,专门用于在 Jetty 和 Tomcat 等内嵌 Servlet 容器上快速运行 Web 应用。当你从单模块项目迈向多模块项目时,Gretty 的 Farm 机制能帮你把多个 Web 应用像搭积木一样组合起来,一套命令同时启动、统一测试、整体打包,这就是本篇文章要分享的 Gradle 多项目优雅集成方案。
为什么多模块项目需要 Gretty Farm?
真实的业务系统往往由多个 Web 应用组成:前端门户、后端服务、管理后台……单模块开发时代,每个应用各自启动、各自调试,端口冲突、环境不一致的问题层出不穷。Gretty 的 Farm(农场)概念正是为此而生——它允许你把多个 Web 应用"圈养"在同一个 Servlet 容器中,共享同一个运行环境。
在 Gretty 的官方示例中,multifarm 目录就是一个标准的复合农场示例,它演示了多模块项目最典型的两种组织方式:
- 多应用农场(Farm):多个独立 Web 应用一起运行
- 复合农场(Composite Farm):多个农场互相引用,再组合成一个更大的农场
第一步:多模块项目的目录结构与 settings.gradle
Gradle 多项目的基础是 settings.gradle,你需要把参与集成的每个子模块都显式声明进来。Gretty 官方示例的目录结构大致如下:
multifarm/
├── AllFarms/ # 复合农场入口,负责聚合所有模块
├── MyWebApp/ # Web 应用 A
├── MyWebApp2/ # Web 应用 B
├── MyWebService/ # 后端服务 A
└── MyWebService2/ # 后端服务 B
对应的 settings.gradle 使用 include 声明每个子项目,并用冒号表示层级关系:
include 'multifarm:MyWebService'
include 'multifarm:MyWebService2'
include 'multifarm:MyWebApp'
include 'multifarm:MyWebApp2'
include 'multifarm:AllFarms'
💡 小技巧:用
项目名:子项目名这种带冒号的路径写法,可以让多模块项目的结构一目了然,也方便后续在 Farm 中精准引用。
第二步:在每个 Web 模块中声明 Farm 依赖
每个参与集成的 Web 模块,只需要应用 war 插件和 Gretty 插件,然后通过 farm 扩展声明自己的"邻居"。以 MyWebApp/build.gradle 为例:
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'
dependencies {
compile 'org.webjars:bootstrap:3.2.0'
compile 'org.webjars:jquery:2.1.1'
}
farm {
webapp project // 把自己加入农场
webapp ':multifarm:MyWebService' // 把后端服务也加入农场
}
这里有两个关键点:
webapp project:把当前模块自身注册为农场中的 Web 应用;webapp ':multifarm:MyWebService':通过路径引用其他模块,实现跨模块集成。
这样配置之后,你在 MyWebApp 目录下执行 gradle farmRun,Gretty 就会自动编译并同时启动 MyWebApp 和 MyWebService 两个应用,无需再手动开两个终端分别启动。
第三步:复合农场如何把多个农场组装起来
如果你的模块更多、关系更复杂,可以采用复合农场模式。在 multifarm/AllFarms/build.gradle 中,整个项目的聚合配置非常简洁:
apply plugin: 'org.akhikhl.gretty'
farm {
include ':multifarm:MyWebApp'
include ':multifarm:MyWebApp2'
}
include 的作用是"引入"其他子项目的 Farm 配置,被引入模块内部定义的 farm { webapp ... } 依赖会被自动合并进来。也就是说:
- MyWebApp 自己带上了 MyWebService
- MyWebApp2 自己带上了 MyWebService2
- AllFarms 把 MyWebApp 和 MyWebApp2 都引入
最终在 AllFarms 目录执行 gradle farmRun,四个应用(两个前端 + 两个后端)会一次性全部启动,这就是复合农场的魔力。
第四步:一次命令搞定启动、测试与打包
Gretty 针对 Farm 场景提供了一组开箱即用的任务,这也是它比手动配置容器更优雅的地方:
| 任务名称 | 用途 |
|---|---|
farmRun |
一次性启动农场内所有 Web 应用 |
farmIntegrationTest |
对农场内所有应用执行集成测试 |
buildProduct |
构建可分发产品,把整个农场打成独立运行包 |
官方示例中的运行方式非常直观:
cd AllFarms
gradle farmRun # 启动整个农场
gradle farmIntegrationTest # 运行集成测试
gradle buildProduct # 构建可分发产品
第五步:多模块集成的进阶注意事项
1. 集成测试如何编写?
每个参与 Farm 的模块都可以编写自己的集成测试。在 Gretty 示例中,测试类通常放在 src/integrationTest/groovy 目录下,例如 multifarm/MyWebApp/src/integrationTest/groovy/org/akhikhl/examples/gretty/mywebapp/WebAppSpec.groovy。测试执行时,Gretty 会自动把农场里的所有应用都启动起来,因此你可以直接测试应用之间的真实交互,比如前端调用后端接口。
2. 端口与上下文路径冲突
多应用同容器运行,端口分配和上下文路径(context path)规划就变得重要。Gretty 支持通过 contextPath、servletContainer 等 DSL 属性精细控制每个应用的行为,你可以参考项目源码中的 libs/gretty 与 libs/gretty-core 模块了解完整的配置项。
3. 从官方示例快速上手
想快速跑通多模块集成,可以直接克隆 Gretty 仓库,其中 integrationTests/multifarm 目录就是现成的学习素材:
git clone https://gitcode.com/gh_mirrors/gr/gretty
仓库中的 integrationTests/farm、integrationTests/farmSecure、integrationTests/farmJacoco 等目录分别演示了普通农场、安全认证农场、集成 JaCoCo 覆盖率农场等不同玩法,非常适合对照学习。
写在最后:Gradle 多项目集成的三个要点
回顾整个 Gretty 多模块项目实战,核心可以总结为三句话:
- 声明清楚:在
settings.gradle中用include声明所有子模块; - 配置依赖:在各模块的
farm块中用webapp声明跨模块引用; - 聚合启动:用
AllFarms之类的聚合模块通过include组装整个农场。
掌握了这套思路,无论你的项目是 2 个模块还是 20 个模块,都能用 Gretty 实现"一键启动、一键测试、一键打包"的优雅集成体验。多模块开发不再手忙脚乱,把精力留给业务本身,让 Gretty 替你管理容器吧!🎉
更多推荐



所有评论(0)