`
bloodwolf_china
  • 浏览: 131468 次
社区版块
存档分类
最新评论

简化grails打包部署

阅读更多
  最近使用grails开发了一个小模块,总共就五个表不到10功能,如果使用熟悉的spring+hibernate估计一两天就能完成,使用grails缺花了我一个星期。毕竟学习新东西还是要花一点时间,一边看文档一边写代码,又走了一点弯路。再加上不知道如何使用grails支持apache的AJP协议,自己写了一个支持AJP协议的Jetty服务。不过通过这段时间的使用感觉grails开发还是比较方便,不需要写那么多配置文件了。
  Jetty服务代码(使用配置文件可能也可以,还没详细研究jetty本身的配置,所以自己写代码了)
public static void main(String[] args) throws Exception {

		String contextPath = extractParam(args, "contextPath");
		if (args == null || ArrayUtils.contains(args, "-?") || ArrayUtils.contains(args, "-h") || ArrayUtils.contains(args, "-help")) {
			System.out.println("parameter format is: contextPath=xx port=xx webPath=xx useAJP");
			return;
		}

		if (contextPath == null)
			throw new Exception("contextPath parameter is not found");

		String sPort = extractParam(args, "port");
		if (sPort == null)
			throw new Exception("port parameter is not found");

		String webPath = extractParam(args, "webPath");
		if (webPath == null)
			throw new Exception("webPath parameter is not found");
		
		//是否使用AJP协议
		boolean useAJP = ArrayUtils.contains(args, "useAJP");

		int port = new Integer(sPort);
		Server server = new Server(port);
		if (useAJP) {
			Connector conn = new Ajp13SocketConnector();
			conn.setPort(port);
			server.setConnectors(new Connector[]{conn});
		}
		
		WebAppContext context = new WebAppContext();
		context.setContextPath(contextPath);
		context.setWar(webPath);
		server.addHandler(context);
		server.start();

	}


  在开发中遇到的第一个问题就是在Service保存两条数据到数据库,结果怎么调试也没有保存,程序也没错误。一开始以为是事务方面的问题,后来发现第二条数据有个字段没有在Domain中设置constraints的nullable属性为true。这个问题花了我半天的时间。因为做的不是CRUD界面,没在执行save方法时检查errors属性。所以要按照文档做好每一步,还不是仅仅凭自己的猜测。

  第二个就是打包部署问题。不可能每次都使用war命令,然后把war文件都上传到服务器。或者把编译到C:\Documents and Settings\$user\.grails\1.0.3\projects\$projectName目录下的所有class都上传到远程服务器。这两种方式都不好,所以参考grails的脚步,自己写一个把所有class打成jar包的脚步,把服务器的WEB-INF/classes下所有class文件删除,再把jar包上传到远程服务器的lib目录下。以后修改程序只要更新一下jar包就可以了,我自己觉得很方便。不知道别人是如何解决这个问题的,国内使用grails做正式开发的好像不太多哦。

jar.groovy内容如下,把它放在$GRAILS_HOME/scripts目录下,执行grails jar就可以了。
import org.codehaus.groovy.grails.compiler.support.*

/**
 * Gant script that creates a WAR file from a Grails project
 * 
 * @author Huzhenglin
 *
 * @since 0.4
 */

Ant.property(environment:"env")                             
grailsHome = Ant.antProject.properties."env.GRAILS_HOME"    
                              
includeTargets << new File ( "${grailsHome}/scripts/Compile.groovy" )


target ('default':'Creates a jar file for deployment onto a Java EE application server.') {
    depends( checkVersion,compile)
		println 1
		jar()
		println "jar all class success"
} 

target (jar: "The implementation target") {
	def fileName = grailsAppName	
	println 1
  def version = Ant.antProject.properties.'app.version'
  if(version) {
      version = '-'+version
  }
  else {
      version = ''
  }
  fileName = "${basedir}/${fileName}${version}.jar"
  println fileName
  Ant.jar(destfile:fileName) {
  		fileset(dir:classesDirPath) {
					include(name:"**/*.class")
			}
  	}
}

分享到:
评论
5 楼 bloodwolf_china 2008-09-17  
我记得以前老版本的grails的Domain对象可以设置optionals,表示那些字段可以为空
新版本的把这个废弃掉了,全部以constraints来设置。结果导致数据保存失败。
4 楼 bloodwolf_china 2008-09-17  
好奇怪。测试打包。运行倒用内置jetty。
您怎么看不懂我的问题啊。我从来没说过打包测试。我的智商没这么低。
我说的是商用环境发布后有新需求,在本地修改测试完了以后,需要重新发布到商用环境。您是用war命令打新的war包重新发布还是用其他方式??
我也知道Grails的领域对象有一个专门的方法可以进行自我验证,save方法返回true和false,然后检查errors属性。如果知道是这儿的问题,难道我故意写错折磨自己?我就是在单元测试service方法时发现这个问题,我描述一下而已
3 楼 魔力猫咪 2008-09-12  
Grails的领域对象有一个专门的方法可以进行自我验证。只要你进行自我验证就可以测试所有的约束是否正确。保存数据可以用Mock模拟进行单元测试。
你是用grails内置环境直接对外提供服务的?我之所以那么说是因为我没遇到过这种情况,开发好后,都是部署到服务器上提供服务的。
公司内部商用测试我觉得你用Grails的内置运行环境就可以了。除了速度慢一点,其他都很好。用开发模式的话,你任何修改Grails都可以自动更新。不用发布。
好奇怪。测试打包。运行倒用内置jetty。
2 楼 bloodwolf_china 2008-09-12  
1、不好意思,我是在测试中发现这个问题的,不过没有对所有的方法都进行了测试,保存另一条数据是一个私有方法,好像也测试不了。早知道这样就改成公有方法进行测试了。

2、我们的服务器值外只开放一个80端口,而且现在好像用内置的jetty服务程序也不少。因为对外接口还会陆续添加,所以不想放到商务的tomcat中影响正常商务运行,就自己写了支持AJP的jetty服务。grails中jetty不支持AJP,我自己写一个也不行?好像有点那个什么点了吧!

3、不是打包测试,是测试完成后如何再次正式发布。因为产品经常变更需要需求。而且是对外的接口。一开始只能模拟测试,只有发布到服务器后才能进行商用测试。发现问题在修改,测试,再发布。不知道【魔力猫咪】是如何重新发布的,总不能每次都发布一个新War包吧。
1 楼 魔力猫咪 2008-09-12  
从描述上看,暴露出楼主的一些问题。
首先是单元测试。验证是可以进行单元测试的。如果楼主进行了单元测试应该不会出现这种问题。
“grails支持apache的AJP协议”???
Grails为什么要支持这个?难道你用Grails内置的Jetty做服务器?这个服务器只是给你用来做开发调试用的。实在没有把它和Apache连接的必要。
最后是打包。Grails的开发调试可以同IDEA7来做。断点什么的都可以。楼主为什么每次都要打包测试?像这种打包测试应该是程序员做完程序,交由测试人员进行功能测试的时候才做的。不雅告诉我你每次改点东西都要发布一个新War包,有单元测试呢。
我用Grails做过一个小系统,电大的课程设计。我觉得Grails用于快速开发真是好东西。不过资料还是太少,目前能找到的就一本Groovy书、一本Grails书和满江红翻译的Grails指南Bate版。书上的版本和现在的还有不少差异,太老了点。

相关推荐

    grails-3.0.5-ga (2/2)

    Grails 是一个基于Groovy语言的开源Web应用框架,它构建于Java平台之上,旨在简化开发过程并提高生产力。在Grails 3.0.5版本中,引入了许多改进和新特性,使得这个版本成为一个重要的里程碑。以下是关于"grails-...

    grails-2.4.4.zip

    部署时,通常会将Grails应用打包成WAR文件,部署在Tomcat、Jetty等Servlet容器上。 8. **最佳实践** 在实际开发中,了解并遵循Grails的最佳实践至关重要,例如,合理划分领域模型、充分利用GSP标签库、使用Service...

    grails中文参考手册

    使用`grails war`命令打包应用为WAR文件,然后在服务器上进行部署。 7. **支持的Java EE容器** Grails兼容广泛的Java应用服务器,包括但不限于Apache Tomcat、Jetty、Resin等,这使得Grails应用能在不同的环境中...

    grails-core源码

    Grails提供了`assemble`、`install`、`war`等任务,方便开发者打包和部署应用。 总结,通过对Grails核心源码的探索,我们可以深入了解其工作原理,更好地利用框架提供的各种功能。无论是对于日常开发还是解决复杂...

    grails中文文档

    7. **构建和部署**:学习 `grails war` 命令打包应用,以及如何将应用部署到各种服务器环境,如 Tomcat 或者 Heroku。 8. **持续集成与自动化测试**:Grails 支持单元测试和集成测试,学习如何编写测试用例,并利用...

    grails 中文第二版

    - 使用`grails war`或`grails package`命令打包应用为WAR文件。 - 可以部署到任何支持Servlet 2.5规范的容器中,如Tomcat、Jetty等。 **所支持的Java EE容器** - 支持Tomcat、Jetty等多种流行的Java EE容器。 - ...

    grails app

    对于生产环境,可以使用`grails war`打包成WAR文件,部署到Tomcat或其他Servlet容器。 尽管缺少图片,但我们仍能从代码中解读出Grails应用的基本结构和工作原理。通过深入研究每个部分,无论是初学者还是经验丰富的...

    grails 入门 大全

    - Grails 应用可以打包为 WAR 文件部署到 Tomcat 或其他 Servlet 容器。 - 也可以使用 Spring Boot 的内置服务器,直接运行应用。 通过这份《Grails 入门大全》的学习,你将能够理解 Grails 的核心概念,掌握基本...

    Groovy轻松入门—Grails实战基础篇

    9. **部署与性能优化**:了解Grails应用的部署选项,如Tomcat、Jetty等应用服务器,以及如何进行性能调优,包括缓存策略、数据库索引优化等。 10. **最佳实践与案例研究**:通过实际项目案例,学习如何在Grails中...

    grails in action

    8. **构建与部署**:书中会介绍如何使用Grails的构建工具进行测试、打包和部署,包括持续集成、性能优化等高级主题。 9. **测试驱动开发(TDD)**:Grails支持TDD,提供了丰富的测试框架,如Spock,帮助开发者编写可...

    精通grails.rar

    同时,Grails还支持War打包,方便云环境部署。 2. 性能优化:通过配置缓存策略、调整GORM参数、使用异步处理等方式,可以显著提升Grails应用的性能。 六、Grails持续集成与测试 1. 测试框架:Grails内置了全面的...

    grails开发笔记

    部署 Grails 应用通常涉及将应用打包成 `.war` 文件并部署到应用服务器如 Tomcat 上。发布前需要注意: - 如果数据库和服务器位于同一系统下,则数据库连接地址应设为 `localhost`。 - 构建后生成的 `.war` 文件...

    Getting-Started-with-Grails-Chinese.rar_Getting Started_grails

    Grails是一个基于Groovy语言的开源框架,它简化了Java平台上的Web应用开发,提供了丰富的功能和高效的生产力。这本书的中文版帮助中国开发者更便捷地学习和掌握Grails。 Grails的核心理念是“Convention over ...

    grails 入门大全

    - 应用的打包和部署也非常便捷,可以生成WAR文件部署到任何支持Java的Web服务器。 9. **Grails 性能优化** - 尽管Grails提供了快速开发的优势,但性能优化仍然是必要的。可以通过缓存、数据查询优化、异步处理等...

    Grails Getting Started-II.pdf

    2. **部署到生产环境**:通常情况下,需要将应用打包成WAR或JAR文件,并部署到如Apache Tomcat、Jetty等容器上。例如,在给定的部分内容中提到的`binstopWebLogic.cmd`,这可能是用于停止WebLogic服务器的一个脚本,...

    Grails1.1中文文档.zip

    9. **构建与部署**:Grails使用命令行工具进行构建,如`grails run-app`启动应用,`grails war`打包成WAR文件以便部署到Servlet容器。了解这些命令以及如何在不同环境中部署Grails应用是实际开发中的重要技能。 10....

    grails 1.0 英文操作手册

    **部署应用**:部署阶段,可以使用`grails war`或`grails package`命令来打包应用,以便在不同的服务器环境中运行。 **支持的Java EE容器**:Grails支持多种Java EE容器,如Tomcat、Jetty、GlassFish等,为应用提供...

    Grails&Groovy学习资料

    5. Grails命令行工具:学会使用`grails`命令创建项目、运行应用、执行测试、打包和部署。 6. 测试驱动开发(TDD):Grails支持单元测试、集成测试和行为驱动开发(BDD),学习如何编写测试用例。 7. 调试和优化:...

Global site tag (gtag.js) - Google Analytics