【Play framework 实用技巧】、模板项目
背景
刚作为新手那会儿,总是基于 Play 样例下载页面 的 play-java-seed
项目开发,每次都在重复工作:下载,解压,修改目录名,修改 build.sbt
,增加模块,调整框架,……轮到真正写代码时,一天基本上废了。
后来重新看 Play 官方文档 时,发现忽略了一个 giter8
特性,这几天捡起来,真是很神奇的体验。
正文
- 体验 g8
- 制造 g8
体验 g8
首先需要安装 Java 开发环境 和 SBT,这样便可以在命令行运行 sbt
操作。
接着打开命令行——这在各个系统上是不一样的,但相同的是,SBT 可以依托于命令行界面:
确认 sbt
可用后,退出到普通命令行界面,然后创建 play
目录,用来管理 Play 项目:
在普通命令行中,切换到这个目录:
输入命令:
sbt new playframework/play-java-seed.g8
如图:
一般来说,新安装的 SBT 在运行时,显示信息不可能这么简洁,它应该要花费较长的一段时间,下载一些依赖到缓存库。有时候可能因为墙的原因,一些依赖会提示下载失败,但通常不会导致命令无效。
你现在可以输入 项目名、组织名、Scala 版本、Play 版本、SBT 版本:
最后,你创建了基于 play-java-seed
种子的 play-demo
项目,它可以从 IDEA 中打开:
选择 红色箭头指向 的 被圈中 的文件,点击 OK 按钮:
默认作为项目打开:
使用默认选项:
注意检查 JDK 环境是否为 1.8
及以上,我这里是家里电脑,所以是 1.8.0_152
版本,懒得升级。
在新的窗口中打开:
提示:基于 SBT 构建的项目有一个尿性,那就是:第一次编译很慢很慢。习惯就好。
编译完成后的项目结构:
我们将选中的文件或目录删除,以保证项目纯粹化:
创建一个运行任务:
步骤:
- 点击 + 号
- 弹窗中选择
Play 2 App
-
Name
处输入APP
- 检查
9000
端口(如果被占用请换一个) - 选择启动模块为
root
提示:这些步骤在 【Play framework 学习笔记】、新手入门 中都有提到,不理解的话,可以传送过去瞧瞧。
点击 OK 按钮之后,就出来一个:
点击运行按钮后,等待一段时间就自动打开网页:
好了,g8
的体验到这里告一段落,接下来我们自己做一个 g8
。
制造 g8
首先你要登录 GitHub 帐号,然后访问 play-java-seed.g8 主页,将它 Fork
为你自己的项目:
点击此项目的 branches
:
进入分支管理页面:
通常你没有 multi-module
这个默认分支,没有关系,你可以克隆项目,然后创建自己的分支推送上来。
推送成功后,你可以将自己的分支设为默认,这样让 giter8
在创建项目时,自动拉取默认分支的代码。
使用 sbt new mrzhqiang/play-java-seed.g8
拉取我的最新代码,你也可以将 mrzhqiang
替换为自己的用户名,只要你的帐号有 Fork
到 play-java-seed.g8 仓库,就没有任何问题。
multi-module
现在让我们简单说明一下,multi-module
这个分支是什么情况。
首先它是一个多模块项目:
多模块项目参考 【Play framework 文字页游2】、架构计划 中的【项目结构】部分。
根目录下的 build.sbt
文件内容揭示了这一切:
name := """play-seed-java"""
organization := "com.github.mrzhqiang"
version := "1.0-SNAPSHOT"
scalaVersion := "2.12.6"
lazy val util = project in file("modules/util")
lazy val core = (project in file("modules/core")).dependsOn(util)
lazy val framework = (project in file("modules/framework")).enablePlugins(PlayJava).dependsOn(util)
lazy val service = (project in file("modules/service")).enablePlugins(PlayJava).dependsOn(framework, core)
lazy val rest = (project in file("modules/rest")).enablePlugins(PlayJava).dependsOn(service)
lazy val root = (project in file(".")).enablePlugins(PlayJava).dependsOn(rest).aggregate(util, core, framework, service, rest)
// lazy val third = (project in file("modules/3rd")).dependsOn(core)
从上到下,它是一个逐步升级的过程,从底层的公共逻辑,到应用层的接口服务。
展开多模块部分,如下:
framework
模块扩展了 Play 框架的特性,比如 在过滤器中记录访问日志,以及 增加响应头中的版本号,其他的就是进行 错误处理(主动抛给服务端的错误,需要筛选出来,转换为客户端错误)、错误响应 和 总过滤器。
ErrorHandler
和 Filters
都要暴露给 root
中的 application.conf
知道,否则不会触发相应的逻辑。
util
模块只是一个单纯的 Java 项目,它仿照 Maven
结构建立,用来处理公共逻辑。
其他模块暂时不作解释,留待未来揭开它们的神秘面纱。
总结
一个精心组织的模板项目,可以节省下来大量时间,更专注于核心的代码实现,而不是结构设计。