浏览 4594 次
锁定老帖子 主题:简化grails打包部署
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-11
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") } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-12
从描述上看,暴露出楼主的一些问题。
首先是单元测试。验证是可以进行单元测试的。如果楼主进行了单元测试应该不会出现这种问题。 “grails支持apache的AJP协议”??? Grails为什么要支持这个?难道你用Grails内置的Jetty做服务器?这个服务器只是给你用来做开发调试用的。实在没有把它和Apache连接的必要。 最后是打包。Grails的开发调试可以同IDEA7来做。断点什么的都可以。楼主为什么每次都要打包测试?像这种打包测试应该是程序员做完程序,交由测试人员进行功能测试的时候才做的。不雅告诉我你每次改点东西都要发布一个新War包,有单元测试呢。 我用Grails做过一个小系统,电大的课程设计。我觉得Grails用于快速开发真是好东西。不过资料还是太少,目前能找到的就一本Groovy书、一本Grails书和满江红翻译的Grails指南Bate版。书上的版本和现在的还有不少差异,太老了点。 |
|
返回顶楼 | |
发表时间:2008-09-12
1、不好意思,我是在测试中发现这个问题的,不过没有对所有的方法都进行了测试,保存另一条数据是一个私有方法,好像也测试不了。早知道这样就改成公有方法进行测试了。
2、我们的服务器值外只开放一个80端口,而且现在好像用内置的jetty服务程序也不少。因为对外接口还会陆续添加,所以不想放到商务的tomcat中影响正常商务运行,就自己写了支持AJP的jetty服务。grails中jetty不支持AJP,我自己写一个也不行?好像有点那个什么点了吧! 3、不是打包测试,是测试完成后如何再次正式发布。因为产品经常变更需要需求。而且是对外的接口。一开始只能模拟测试,只有发布到服务器后才能进行商用测试。发现问题在修改,测试,再发布。不知道【魔力猫咪】是如何重新发布的,总不能每次都发布一个新War包吧。 |
|
返回顶楼 | |
发表时间:2008-09-12
Grails的领域对象有一个专门的方法可以进行自我验证。只要你进行自我验证就可以测试所有的约束是否正确。保存数据可以用Mock模拟进行单元测试。
你是用grails内置环境直接对外提供服务的?我之所以那么说是因为我没遇到过这种情况,开发好后,都是部署到服务器上提供服务的。 公司内部商用测试我觉得你用Grails的内置运行环境就可以了。除了速度慢一点,其他都很好。用开发模式的话,你任何修改Grails都可以自动更新。不用发布。 好奇怪。测试打包。运行倒用内置jetty。 |
|
返回顶楼 | |
发表时间:2008-09-17
好奇怪。测试打包。运行倒用内置jetty。
您怎么看不懂我的问题啊。我从来没说过打包测试。我的智商没这么低。 我说的是商用环境发布后有新需求,在本地修改测试完了以后,需要重新发布到商用环境。您是用war命令打新的war包重新发布还是用其他方式?? 我也知道Grails的领域对象有一个专门的方法可以进行自我验证,save方法返回true和false,然后检查errors属性。如果知道是这儿的问题,难道我故意写错折磨自己?我就是在单元测试service方法时发现这个问题,我描述一下而已 |
|
返回顶楼 | |
发表时间:2008-09-17
我记得以前老版本的grails的Domain对象可以设置optionals,表示那些字段可以为空
新版本的把这个废弃掉了,全部以constraints来设置。结果导致数据保存失败。 |
|
返回顶楼 | |