Gretty 多模块项目实战:Gradle 多项目下如何优雅集成

【免费下载链接】gretty Advanced gradle plugin for running web-apps on jetty and tomcat. 【免费下载链接】gretty 项目地址: https://gitcode.com/gh_mirrors/gr/gretty

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' // 把后端服务也加入农场
}

这里有两个关键点:

  1. webapp project:把当前模块自身注册为农场中的 Web 应用;
  2. 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 支持通过 contextPathservletContainer 等 DSL 属性精细控制每个应用的行为,你可以参考项目源码中的 libs/grettylibs/gretty-core 模块了解完整的配置项。

3. 从官方示例快速上手

想快速跑通多模块集成,可以直接克隆 Gretty 仓库,其中 integrationTests/multifarm 目录就是现成的学习素材:

git clone https://gitcode.com/gh_mirrors/gr/gretty

仓库中的 integrationTests/farmintegrationTests/farmSecureintegrationTests/farmJacoco 等目录分别演示了普通农场、安全认证农场、集成 JaCoCo 覆盖率农场等不同玩法,非常适合对照学习。

写在最后:Gradle 多项目集成的三个要点

回顾整个 Gretty 多模块项目实战,核心可以总结为三句话:

  1. 声明清楚:在 settings.gradle 中用 include 声明所有子模块;
  2. 配置依赖:在各模块的 farm 块中用 webapp 声明跨模块引用;
  3. 聚合启动:用 AllFarms 之类的聚合模块通过 include 组装整个农场。

掌握了这套思路,无论你的项目是 2 个模块还是 20 个模块,都能用 Gretty 实现"一键启动、一键测试、一键打包"的优雅集成体验。多模块开发不再手忙脚乱,把精力留给业务本身,让 Gretty 替你管理容器吧!🎉

【免费下载链接】gretty Advanced gradle plugin for running web-apps on jetty and tomcat. 【免费下载链接】gretty 项目地址: https://gitcode.com/gh_mirrors/gr/gretty

更多推荐