入门
安装要求
在安装 Grails 之前,您至少需要安装 1.8 或更高版本的 Java开发工具包(JDK)。为您的操作系统下载适当的 JDK,运行安装程序,然后设置一个名为JAVA HOME 的环境变量,指向此安装的位置。
JDK 1.8 环境安装,不会的就自行百度吧。
下载安装
使用 Grails 的第一步是安装 Grails 发行包。官方推荐使用 SDKMAN 来安装(但是笔者观测下来好像 SDKMAN 在 Java 开发者中用的并不多)。
使用 SDKMAN 安装
安装最新版本的 Grails,在终端执行以下命令
> sdk install grails
也可以指定安装版本
> sdk install grails 4.0.3
你还可以到这里查看 SDKMAN 更多的用法:SDKMAN 文档。
手动安装
手动安装的步骤如下:
- 下载一个二进制发行包,然后解压到你认为合适的目录
- 设置一个 GRAILS_HOME 环境变量指向你解压的目录
- 在类 Unix/Linux 系统上,通常需要在 profile 文件中添加
export GRAILS\u HOME=/path/to/GRAILS
- 在 Windows 上,就是通常的设置环境变量啦:
右键 计算机 -> 属性 -> 高级系统设置 -> 环境变量
- 在类 Unix/Linux 系统上,通常需要在 profile 文件中添加
做完这些,你可以再命令行里执行命令:grails -version
,如果有类似以下输出,就说明安装好了:
Grails version: 4.0.3
创建一个应用
要创建Grails应用程序,首先需要熟悉 Grails 命令的用法,它的使用方式如下:
> grails <<command name>>
执行create-app
命令来创建一个应用:
> grails create-app helloworld
这将在当前目录下新建一个目录,在控制台进入这个目录:
> cd helloworld
Hello Wrold
现在让我们把这个新项目变成经典的 Hello Wrold。首先,进入您刚刚创建的 helloworld 目录并启动 Grails 的交互控制台:
> cd helloworld
> grails
2
然后,你应该看到如下的页面:
我们想要的是一个简单的页面,只输出 "Hello World!" 到浏览器。在 Grails 中,每当想要一个新页面,您只需为它创建一个新的 Controller。由于我们还没有 Controller,现在使用create controller
命令创建一个 Controller:
grails> create-controller hello
别忘了,在交互式控制台中,我们有命令自动补全功能。因此,您可以键入 "cre",然后按<tab>
键获得所有已create-
开头的命令。再键入几个命令名字母,然后再次<tab>
就可以自动补全命令。
以上的命令经在grails-app/controllers/helloworld
文件夹内创建一个HelloController.groovy
代码文件。为什么会多出一个helloworld
文件夹呢?因为在 Java 领域,强烈建议所有的类都要放到 packages(包)下面,所以,当没有指定一个包名时,Grails 框架会默认把应用名作为它的包名。
现在我们有一个 Controller 了,我们再添加一个 action 来说生成 "Hello Wrold" 页面。在任意一个文本编辑器里,编辑这个 Controller 文件 —— 添加一行代码:
package helloworld
class HelloController {
def index() {
render "Hello World!"
}
}
2
3
4
5
6
7
8
这个 action 是一个简单的方法,在这个例子里,它调用 Grails 提供的方法render
来渲染一个文本。
接下来,只需使用一个run-app
命令启动服务:
grails> run-app
这将在 8080 端口启动一个内置的服务,你现在应该可以通过地址:http://localhost:8080/ 来访问你的应用了,赶快试一下吧!
如果想在设置一个 contxt path, 你可以编辑配置文件grails-app/conf/application.yml
:
server:
servlet:
context-path: /helloworld
2
3
配置好之后,再次启动,您的应用的访问地址就变成了:http://localhost:8080/helloworld/
或者你也可以使用命令行参数来达到相同的效果:
grails> run-app -Dgrails.server.servlet.context-path=/helloworld
如果报错:"Server failed to start for port 8080: Address already in use"
这意味这在这个端口上运行着另一个服务,这时你可以换个端口,比如使用run-app -port=9090
在 Windows 上,如果报错:"> A problem occurred starting process 'command 'C:\path\to\java.exe''"
使用run-app --stacktrace
重新启动一下,如果它的根异常是 "Caused by: java.io.IOException: CreateProcess error=206, The filename or extension is too long",则在build.gradle
文件里添加:grails { pathingJar = true }
,这是 Windows 的一个限制。
在浏览器打开后,效果应该类似这样:
这是由文件grails-app/view/index.gsp
渲染出来的首页,它会检测出应用中所有的 Controller 并已链接列表形式展示。你可以点击 "HelloController" 链接来查看你写的 Hello World 页面,它将展示一个文本:"Hello World!"。真棒!你已经有了第一个可以运行的 Grails 应用啦。
使用交互模式
从 v3.0,Grails 开始支持交互模式,它使得命令执行更快,因为 JVM 不必为每个命令都重新启动了。 要使用交互模式,只需在项目的根目录的终端中键入grails
,然后还可以使用 TAB 补全,获取可用命令的列表。示例:
交互模式的更多信息,可参考 交互模式
开发工具
IntelliJ IDEA
IntelliJ IDEA 对应 Grails 来说是个的非常出色的 IDE。它有两个版本:免费的 Community 版,和付费的 Ultimate 版。
Community 版可以胜任大多数开发情景,除了 GSP 语法高亮只在 Ultimate 版支持。
TIP
如果使用的是 Community 版,你可以使用 HTML 编辑器打开 GSP 文件。
要使用 Intellij IDEA 来开发,只需点击菜单 File -> Open
然后选择的 build.gradle 文件即可导入 Grails 项目。
TextMate, Sublime, VIM 等
还有几个优秀的文本编辑器可以很好地用于 Groovy 和 Grails 开发。以下是一些参考:
- Textmate 可使用 groovy-grails.tmbundle 来支持 Groovy / Grails;
- Sublime Text 可通过 Sublime Package Control 安装 sublimetext-grails 插件;
- 如果使用 VIM ,可以参考这篇 博客;
- Atom 中可以使用 atom-grails。
约定优于配置
Grails 遵从约定优于配置规则。这通常意味着默认起作用的是文件的名称和位置,而不是显式的配置,因此您需要先熟悉 Grails 项目的目录结构:
- grails-app - Groovy 代码的顶层目录
- conf - 配置文件目录
- controllers - Web 控制器目录,MVC 中的 C
- domain - 应用的模型目录,MVC 中的 M
- i18n - 语言国际化目录
- init - 容放应用的 Application 类和 BootStrap 脚本
- services - 服务层目录
- taglib - 标签库目录
- utils - 工具类目录
- views - GSP 或者 JSON View 目录,MVC 中的 V
- src/main/scripts - 代码生成脚本
- src/main/groovy - 额外 Groovy 代码目录
- src/test/groovy - 单元和集成测试目录
运行和调试
运行
Grails 应用可以通过run-app
命令默认在 8080 端口启动内置的 Tomcat 服务
> grails run-app
也可以使用-port
参数指定启动的端口:
> grails run-app -port=8090
当然,最好在交互模式中启动服务,这样重启操作会快的多:
> grails
grails> run-app
| Grails application running at http://localhost:8080 in environment: development
grails> stop-app
| Shutting down application...
| Application shutdown.
grails> run-app
| Grails application running at http://localhost:8080 in environment: development
2
3
4
5
6
7
8
调试
Grails 中调式应用有两种方法。
第一种调式
在 IDE 中右击 init 目录下的Application.groovy
,然后选择合适的操作来调试你的应用。在 IDEA 中操作如下:
第二种调试
另外,也可以使用下面的命令启动应用,然后再给它 attach 一个 远程 debugger。
> grails run-app --debug-jvm
当控制台出现如下输出时,表示已可以 attach 一个 远程 debugger 了:
grails> run-app --debug-jvm
| Running application...
Listening for transport dt_socket at address: 5005
2
3
在 IDEA 中 attach 一个 远程 debugger 的方法:点击菜单Run -> Edit Configurations...
,弹出对话框如下:
然后依次操作:
- 点击左上角(1)处的加号
- 在(2)处取个名字 RemoteDebug
- 在(3)处选择要 debug 的模块
- 然后在(4)处点击 OK
- 在(5)处选择刚刚新建的 RemoteDebug
- 点击(6)处的 debug 按钮开始调试。
笔者经验
笔者在使用 Grails 3 时,使用第一种调试方法有时会出现一些很诡异的事情,使用第二种则一直很稳定。
测试和部署
测试
Grails 的create-*
命令会自动的在目录src/test/groovy
下创建单元和集成测试文件。当然你需要在里面编写一下有效的逻辑代码。
你可以使用命令test-app
来执行这些测试:
> grails test-app
部署
Grails 应用可以通过多种方式来部署。
如果你想部署到传统的容器里(Tomcat,Jetty 等),你可以使用命令war
来打包:
> grails war
它将在目录build/libs
下生成一个 WAR 文件,然后你可以按照具体容器的说明进行部署。
默认情况下,打出的这个 WAR 文件里包含一个内置版本的 Tomcat,你可以使用如下命令直接启动它:
> java -jar ./path/to/your/xxx.war
要注意的是,如果你直接把它部署到一个与内置容器不同版本的外部 Tomcat 容器里,是会出问题的。如果你不想打出的 WAR 文件包含内置容器,你可以在build.gradle
文件里把 Tomcat 依赖的 secpe 修改为provided
:
provided "org.springframework.boot:spring-boot-starter-tomcat"
默认情况下,Grails 是针对 Tomcat 8 的 API 来打包的, 如果你想把 WAR 文件部署到 Tomcat 7 上,则还需要在build.gradle
文件里的dependencies { }
块的上方添加一行:
ext['tomcat.version'] = '7.0.59'
大多命令的默认执行环境都是dsevelopment
,而war
命令不同,它默认的环境是production
。但是和其它命令一样的是,你可以在执行时指定环境:
> grails dev war
在实际部署时,您应该始终使用-server
选项和足够的内存分配来运行。一组好的 VM 参数可以这样:
-server -Xmx768M -XX:MaxPermSize=256m
支持的容器
Grails 可以运行在任何支持 Servlet 3.0 及更高版本的容器上,并且已知在以下特定的容器上运行良好:
- Tomcat 7+
- GlassFish 3+
- Resin 4+
- JBoss 6+
- Jetty 8+
- Oracle Weblogic 12c+
- IBM WebSphere 8.0+
TIP
若在 WebSphere 8 以下的版本上部署,需要在 "Application servers > server > Process Definition > Java Virtual Machine > Generic JVM arguments" 里设置 "-Xverify:none",在 WebSphere 8 及以上的版本里则不再需要了。
然而在之外的一些容器里还有问题,虽然大多数情况下都可以工作正常,你可以到 Grails wiki 里可以查看到一些 已知的问题列表。
此外,有关如何将Grails部署到各种流行云服务,可以参考 Grails 指南。
创建组件
Grails 自带一些非常便利的命令,比如create-controller
、create-domain-class
等,它们可以帮你自动创建controllers
和其他组件。当然,这些只是为了方便,您同样可以使用 IDE 或其它文本编辑器去创建它。
例如,创建一个 Hello World 项目,然后再创建一个 book 域模型,可以这样:
> grails create-app helloworld
> cd helloworld
> grails create-domain-class book
2
3
这将在项目目录grails-app/domain/helloworld/
下生成一个Book.groovy
域类:
package helloworld
class Book {
}
2
3
4
还有许多想create-*
的命令,详细请看命令行指南。
TIP
使用交互式模式,可缩短命令的执行时间。
脚手架
Grails 有个脚手架功能,它可以帮助我们快速生成一个应用的基本骨架。
我们只需使用generate-all
命令,它会自动生成controller
(包括它的单元测试)还有相关的views
(GSP页面):
> grails generate-all helloworld.Book
赶快试一下吧。