29、Grails 应用开发与部署全解析

Grails 应用开发与部署全解析

1. 日志管理

在开发环境中,为了便于调试,我们可能希望记录更多的日志信息。例如,以下配置可以将所有控制器的日志级别设置为调试级别:

environments {
    development {
        log4j {
            logger {
                grails {
                    app.controller="debug"
                }
            }
        }
    }
}

你只需将此配置添加到 Config.groovy 文件的末尾,然后重启应用程序,新的开发特定日志配置就会生效。不过在生产环境中,出于性能考虑以及避免日志文件占用过多磁盘空间,你可能希望减少日志记录。

2. 应用打包

完成一个迭代或版本的应用功能开发后,需要将应用打包以便部署到其他机器上。最基本的操作是运行 Grails 的 war 目标来创建可部署的 WAR 文件。但为了更方便地识别应用在不同环境中的版本,建议遵循以下步骤进行里程碑版本发布:
1. 从版本控制仓库更新代码,确保与主干同步。
2. 运行单元测试和冒烟测试,验证版本是否准备就绪。
3. 手动或使用 grails set-version 目标增加 application.properties 文件中的 app.version 属性,以标识里程碑版本号,如 X.X.X
4. 使用 grails clean 目标清理项目,确保没有遗留的工件。
5. 使用 grails war 目标和环境指定(例如 grails prod war )将应用打包成 WAR 文件。这将在项目根目录下创建一个包含项目名称和版本号的 WAR 文件。
6. 再次增加 app.version 属性,并在后面追加 -SNAPSHOT ,以表明此版本正在开发中,不是里程碑版本。
7. 将 application.properties 文件提交回版本控制仓库。

3. 应用部署

打包为 WAR 文件的 Grails 应用可以部署到 Java EE 应用服务器(如 JBoss、GlassFish、Apache Geronimo、BEA WebLogic 或 IBM WebSphere)或 Web 容器(如 Apache Tomcat 或 Jetty)。不同容器的部署方式差异很大,因此需要查阅应用服务器或 Web 容器的文档以获取详细信息。常见的部署机制包括将 WAR 文件复制到特定的部署目录、使用基于 Web 的管理控制台、命令行客户端和/或 Apache Ant 任务。Grails 本身没有提供简化部署的功能,不过可以编写自己的脚本实现自动化部署。

4. HTTPS 配置

许多应用需要对从浏览器传递到服务器的信息进行加密,以确保数据不被中途拦截。通常使用安全的 HTTP 连接(即 HTTP over Secure Socket Layer,简称 HTTPS)来实现。HTTPS 配置是特定于应用服务器的,因此需要查阅应用服务器的文档来了解如何进行配置。不过,在 HTTPS 环境中测试应用非常关键,Grails 提供了使用 HTTPS 启动应用的功能。只需使用 grails-run-https 代替 grails run-app ,服务器将在端口 8080 和 8443 上使用 HTTPS 协议可用。例如: https://localhost:8443/collab-todo/ 。以这种模式运行服务器会生成一个临时证书,但会提示未知认证机构错误,因此这种方法不适用于生产环境,但适合测试。

5. 使用 Gant 自动化任务

开发过程中充满了重复的任务,如编译、打包和部署。手动执行这些任务既枯燥又容易出错,因此自动化这些任务是最佳实践。Grails 的命令行工具利用了 Gant,这是一个使用 Groovy 语言编写 Apache Ant 任务脚本的构建系统。Gant 主要由一系列名为目标的任务集合组成,你可以执行这些目标来完成一项工作。

Grails 命令行使用以下目录来定位脚本并将其集成到帮助系统中:
- USER_HOME/.grails/scripts
- PROJECT_HOME/scripts
- PROJECT_HOME/plugins/*/scripts
- GRAILS_HOME/scripts

编写好 Gant 脚本后,将其放在这些目录中的任何一个,它将自动在 Grails 命令行和帮助列表中可用。以下是一个简单的部署脚本示例:

01 /**
02 * Gant script that copies a WAR file to an application
03 * server deployment directory.
04 */
05
06 Ant.property(environment:"env")
07 grailsHome = Ant.antProject.properties."env.GRAILS_HOME"
08 
09 includeTargets << new File ( "${grailsHome}/scripts/War.groovy" )
10
11 target ('default':'''Copies a WAR archive to a Java EE app server's deploy
12 directory.
13
14 Example: 
15 grails deploy
16 grails prod deploy
17 ''') {
18   deploy()
19 } 
20
21 target (deploy: "The implementation target") {
22   depends( war )
23 
24   def deployDir = Ant.antProject.properties.'deploy.dir'
25
26   Ant.copy(todir:"${deployDir}", overwrite:true) {
27     fileset(dir:"${basedir}", includes:"*.war") 
28   }       
29
30  event("StatusFinal", ["Done copying WAR to ${deployDir}"])
31 }

此脚本首先加载所有系统环境变量,并将 GRAILS_HOME 环境变量存储到本地变量中。然后导入 War.groovy 脚本,因为部署脚本依赖它来构建 WAR 文件。脚本有两个目标, default 目标是默认执行的目标,它会调用 deploy 目标。 deploy 目标会调用 war 目标创建 WAR 文件,然后查找 deploy.dir 属性,并将 WAR 文件复制到该属性指定的位置。运行 grails deploy 即可完成部署。

6. 应用升级

Grails 框架在开发早期就意识到需要一种机制来确保应用能够轻松迁移到新版本。通过 Grails 的 upgrade 目标可以实现这一点。在使用 run-app 目标启动应用时,Grails 会检查 application.properties 文件中的 app.grails.version 号。如果当前配置的 Grails 版本与应用元数据中的版本号不匹配,Grails 会显示相应的提示信息,此时运行 grails upgrade 即可完成应用升级。但需要注意的是,升级时 Grails 可能会覆盖现有文件,因此在运行升级目标之前,最好确保应用与版本控制仓库同步。

7. 环境搭建

使用 Groovy 创建命令行脚本和富 Groovy 客户端时,除了之前安装的 Groovy,还需要下载并安装一些额外的库,包括 SwingXBuilder、SwingX、JGoodies Forms 和 Glazed Lists。下载这些库后,可以选择将它们安装在以下三个位置之一:
- CLASSPATH 环境变量中
- <GROOVY_HOME>\lib 目录下
- <USER_HOME>\groovy\lib 目录下

各库的下载链接如下表所示:
| 库名称 | 下载 URL |
| ---- | ---- |
| SwingXBuilder | http://docs.codehaus.org/download/attachments/80916/swingxbuilder-0.1.5.jar?version=1 |
| SwingX | https://swingx.dev.java.net/files/documents/2981/76227/swingx-0.9.1.zip |
| JGoodies Forms | https://glazedlists.dev.java.net/files/documents/1073/94614/glazedlists_java14.jar |
| Glazed Lists | http://www.jgoodies.com/download/libraries/forms/forms-1_2_0.zip |

8. 命令行脚本

之前使用 Groovy 构建了 Collab-Todo 应用的领域对象、控制器和服务,其实 Groovy 还有其他用途。可以创建脚本在命令行上对待办事项执行 CRUD 操作。以 GetRestClient.groovy 脚本为基础,进行以下增强后可以创建 GetAllTodos.groovy 脚本:

01 import groovy.util.XmlSlurper
02
03 if (args.size() < 2 )
04 {
05   //USAGE()
06   println """Usage: groovy GetAllTodos userid password"""
07   System.exit(1)
08 }
09
10 // Define some thing we will need.
11 def userid = args[0]
12 def password = args[1]
13 def url = "http://localhost:8080/collab-todo/rest/todo"
14 def slurper = new XmlSlurper()
15
16 println "\nGetting All Todos for ${userid}:"
17
18 def conn = new URL(url).openConnection()
19 conn.requestMethod = "GET"
20 conn.doOutput = true
21
22 if (userid && password) {
23     conn.setRequestProperty("Authorization", "Basic ${userid}:${password}")
24 }
25
26 if (conn.responseCode == conn.HTTP_OK) {
27   def response
28
29   conn.inputStream.withStream {
30     response = slurper.parse(it)
31  }
32   println "\nNo. of Todo Records: ${response.todo.size()}"
33   response.todo.each {
34     println "-------------------------------------"
35     println "Id:             ${it.@id}"
36     println "Name:           $it.name"
37     println "Note:           $it.note"
38     println "Owner:          ${it.owner.@id}"
39     println "Create Date:    $it.createDate"
40     println "Completed Date: $it.completedDate"
41     println "Due Date:       $it.dueDate"
42     println "Priority:       $it.priority"
43     println "Status:         $it.status"
44   }
45 }
46
47 conn.disconnect()

此脚本会验证是否提供了用户 ID 和密码作为参数,若未提供则显示使用说明并退出。接着设置连接的授权头,访问 Web 服务并检查响应是否有效。如果响应有效,使用 XmlSlurper 解析 XML 响应,并遍历每个待办事项打印其内容。运行脚本的命令如下:

> groovy GetAllTodos user1 password

运行结果示例如下:

Getting All Todos:
No. of Todo Records: 2
-------------------------------------
Id:             3
Name:           User1 Todo 1
Note:           User1 Todo 1 Note
Owner:          2
Create Date:    2008-01-13 11:06:00.0

除了使用 XmlSlurper 读取 XML,还可以使用 Groovy 的 XmlParser DOMCategory ,更多信息可参考 http://groovy.codehaus.org/Processing+XML。

9. 富 Groovy 客户端构建

在完成命令行脚本的开发后,我们可以进一步构建一个富 Groovy 客户端,这里借助 Swing 应用来实现。前面已经完成了环境搭建,安装了所需的额外库,现在可以利用这些库的功能来构建一个更具交互性的客户端。

9.1 各库的作用
  • SwingXBuilder :这是一个 Groovy 构建器,用于构建 Swing 用户界面。它使用 SwingLabs(SwingX)组件,大大简化了 Swing 应用的构建过程,避免了手动构建界面的繁琐。
  • SwingX :为 SwingXBuilder 提供组件支持,使得构建出的界面更加丰富和美观。
  • JGoodies Forms :是一个流行的 Swing 布局管理器,采用网格方法,方便我们在 Swing 应用中定位组件。
  • Glazed Lists :是一个强大的 Swing 表格组件,可用于显示待办事项的摘要信息。
9.2 构建思路

借助这些库,我们可以构建一个具有图形界面的客户端,用户可以通过界面直观地进行待办事项的管理操作,如查看、添加、修改和删除等。虽然具体的代码实现未在给定内容中详细给出,但我们可以基于这些库的功能进行合理的设计。例如,使用 SwingXBuilder 构建主窗口,利用 JGoodies Forms 进行布局,使用 Glazed Lists 显示待办事项列表。

10. 总结与回顾

本文围绕 Grails 应用的开发与部署展开了全面的介绍,涵盖了多个重要方面,以下是对各部分内容的总结:

部分 主要内容
日志管理 在开发环境可设置调试级日志,生产环境可减少日志记录。通过配置 Config.groovy 文件实现开发特定日志配置。
应用打包 完成功能开发后,遵循特定步骤打包应用,包括更新代码、测试、设置版本号、清理项目、打包成 WAR 文件等。
应用部署 Grails 应用可部署到多种 Java EE 应用服务器或 Web 容器,可编写 Gant 脚本实现自动化部署。
HTTPS 配置 许多应用需使用 HTTPS 加密数据,Grails 提供使用 HTTPS 启动应用的功能,适合测试但不适用于生产环境。
使用 Gant 自动化任务 Grails 命令行利用 Gant 构建系统,可将编写的 Gant 脚本放在指定目录实现自动化任务。
应用升级 通过 Grails 的 upgrade 目标可实现应用升级,但升级前需确保应用与版本控制仓库同步。
环境搭建 使用 Groovy 构建命令行脚本和富客户端需安装额外库,可选择安装在 CLASSPATH <GROOVY_HOME>\lib <USER_HOME>\groovy\lib 目录下。
命令行脚本 GetRestClient.groovy 为基础可创建增强的 GetAllTodos.groovy 脚本,实现命令行对待办事项的 CRUD 操作。
富 Groovy 客户端构建 利用 SwingXBuilder、SwingX、JGoodies Forms 和 Glazed Lists 等库可构建富 Groovy 客户端。

整体流程回顾

graph LR
    A[日志管理] --> B[应用打包]
    B --> C[应用部署]
    C --> D[HTTPS 配置]
    D --> E[使用 Gant 自动化任务]
    E --> F[应用升级]
    F --> G[环境搭建]
    G --> H[命令行脚本]
    H --> I[富 Groovy 客户端构建]

通过以上步骤和技术的运用,我们可以高效地开发、部署和管理 Grails 应用,并且利用 Groovy 语言的特性开发出功能丰富的客户端。无论是在开发环境的调试,还是生产环境的部署和维护,都能找到相应的解决方案。同时,通过自动化任务和合理的日志管理,提高了开发效率和系统的稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值