# 入门

# 安装要求

在安装 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 上,就是通常的设置环境变量啦:右键 计算机 -> 属性 -> 高级系统设置 -> 环境变量

做完这些,你可以再命令行里执行命令: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

然后,你应该看到如下的页面:

我们想要的是一个简单的页面,只输出 "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!"
    }
}

这个 action 是一个简单的方法,在这个例子里,它调用 Grails 提供的方法render来渲染一个文本。

接下来,只需使用一个run-app命令启动服务:

grails> run-app

这将在 8080 端口启动一个内置的服务,你现在应该可以通过地址:http://localhost:8080/ 来访问你的应用了,赶快试一下吧!

如果想在设置一个 contxt path, 你可以编辑配置文件grails-app/conf/application.yml

server:
    servlet:
        context-path: /helloworld

配置好之后,再次启动,您的应用的访问地址就变成了: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 开发。以下是一些参考:

# 约定优于配置

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

# 调试

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

在 IDEA 中 attach 一个 远程 debugger 的方法:点击菜单Run -> Edit Configurations...,弹出对话框如下:

然后依次操作:

  1. 点击左上角(1)处的加号
  2. 在(2)处取个名字 RemoteDebug
  3. 在(3)处选择要 debug 的模块
  4. 然后在(4)处点击 OK
  5. 在(5)处选择刚刚新建的 RemoteDebug
  6. 点击(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-controllercreate-domain-class等,它们可以帮你自动创建controllers和其他组件。当然,这些只是为了方便,您同样可以使用 IDE 或其它文本编辑器去创建它。

例如,创建一个 Hello World 项目,然后再创建一个 book 域模型,可以这样:

> grails create-app helloworld
> cd helloworld
> grails create-domain-class book

这将在项目目录grails-app/domain/helloworld/下生成一个Book.groovy域类:

package helloworld

class Book {
}

还有许多想create-*的命令,详细请看命令行指南

TIP

使用交互式模式,可缩短命令的执行时间。

# 脚手架

Grails 有个脚手架功能,它可以帮助我们快速生成一个应用的基本骨架。

我们只需使用generate-all命令,它会自动生成controller(包括它的单元测试)还有相关的views(GSP页面):

> grails generate-all helloworld.Book

赶快试一下吧。