领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Grails 似乎正在蓬勃发展,并且看起来它确实“有腿”,就像人们常说的那样。我对在Web应用程序领域之外稍微伸展一下这些腿非常感兴趣。如果您了解我在Spring Batch方面的工作,您可能就能猜到这会把我带到哪里。但是在这篇文章中,我只想分享一些我在Grails应用程序的基本、底层部署和构建方面的一些经验。
我对Maven 2有一种爱恨交加的情感,我正在学习爱上Grails,但遗憾的是,这两个工具之间并不特别兼容。如果能看到更紧密的集成,那将是非常好的。Maven并不总是我们想要的全部,但有些事情确实让它物有所值。它是一种标准(无论你喜欢与否),所以当我从某个地方下载一个项目时,我已经知道如何构建它,它的依赖项是什么以及文档在哪里。Grails具有一些相同的功能,实际上还包含了自己的基于Groovy脚本的Ant的相当复杂的构建工具。也许有一种折中的方法,我们可以兼得两者的优势?
我还了解到该领域的一些其他活动,我希望我们能够围绕某些东西达成共识(也许是由这个论坛和Grails JIRA中的讨论驱动的)。例如,参见Frederick Verbist的博客和Arnaud Heritier的Maven集成项目(目前还处于起步阶段)。Grails团队传统上对Maven印象不佳(例如,参见此处),但我与Graeme Rocher进行了交谈,他愿意接受建议,所以我希望我们能够在这里取得一些进展。
本着朝着Maven集成迈出一些简单步骤的精神,我附加了一组poms,这些poms(大致)描述了Grails的依赖项结构,就我所知,它在Grails 0.5.6中。如果您遇到问题,请忽略或更改Spring版本号 - Grails 0.5.6使用Spring 2.0,但我需要2.1才能完成我正在处理的一个项目。Graham说,Grails可能无法与更高版本的Spring正常工作,因此您的里程可能会有所不同。这就是Maven的妙处,对吧?您可以显式地(以及传递地)查看项目依赖项,并且您可以根据自己的需要和风险承受能力以您控制的方式调整它们。
致Maven用户:依赖项插件比以前工作得更好,您可以使用“mvn dependency:tree”打印出依赖项树。这仅适用于全新的插件,因此请确保apache-snapshots存储库位于您的插件存储库中
<pluginRepositories>
<pluginRepository>
<id>apache-snapshots</id>
<url>http://people.apache.org/maven-snapshot-repository</url>
</pluginRepository>
</pluginRepositories>
比不得不构建整个站点并在依赖项报告中查找要方便得多,这是我过去经常做的事情。
在附带的沙箱存档中,有三个pom,每个pom都在其自己的项目中
要安装Grails poms,您无需手动将任何工件添加到本地存储库。还有一些“有趣的东西”(在任何我可以找到的标准公共存储库中都不可用),我已经包含在“spring-ext”存储库中(在pom中定义)。如果您连接到互联网,它应该可以开箱即用。
您需要Maven(2.0.*)和Grails(0.5.6)才能运行示例应用程序。我正在使用Maven 2.0.7。“grails”和“mvn”启动脚本需要位于您的路径中,并且您需要定义GRAIL_HOME环境变量才能运行Grails(标准安装过程)。
还有一个测试项目,它使用上述poms来管理Web应用程序。我决定坚持使用Grails目录布局。Graham告诉我,web-app/WEB-INF中几乎所有“可变”内容都将在Grails 1.0中删除,因此我认为使用Grails指定的结构是前进的最佳方式(最不可能脆弱,易于其他Grails开发人员理解)。
从Grails命令行启动
$ cd test
$ mvn package
$ grails run-app
要向测试项目添加其他依赖项,只需将它们添加到pom中并重复练习(或在Eclipse中不执行任何操作,请参见下文)。Maven是不是很棒?
请注意,Grails依赖项在项目pom中具有scope=provided。这意味着它们位于Maven和Eclipse的类路径中,但不会包含在任何Maven打包中(如果已实现)。
如果您不使用Maven Eclipse扩展,那么您可能可以使用Eclipse Maven插件(也称为maven-eclipse-plugin)。使用“mvn eclipse:eclipse”更新.classpath并刷新,然后您应该没问题,但无法与其他Eclipse项目的更改自动同步。
您需要首先从命令行执行“grails package”(仅一次)
$ cd test
$ grails package
这将为您生成一个web.xml,并将一些属性文件从grails-app/conf复制并过滤到其中。显然,长期前景可能是web.xml将是web-app/WEB-INF中唯一生成的的文件(因此每个人的源代码控制系统中只有一个svn:ignore)。
在Eclipse中,您可以导入测试项目。然后,您可以执行“运行...”并从Java应用程序中选择“test”启动器。您可以调试,并且可以动态更改代码,无论是在Grails应用程序中还是在依赖项目中。
以下是一些已知问题或烦恼
问题在于Maven依赖项插件不允许我们排除提供的依赖项(目前是这样),因此当您执行“mvn package”时,所有Grails依赖项最终都会出现在./lib中。这对Grails开发人员来说并不舒服,因为它们通常是从GRAILS_HOME/lib复制的。理想情况下,这种争端将在我们能够说我们真正拥有Maven-Grails集成之前得到解决。
例如,我们希望从Grails项目布局构建WAR文件。使用Ant和Maven实现这一点并不困难。理想情况下,它将作为Maven插件实现 - 基本上这就是Arnaud的项目,所以我希望他能够取得一些进展,但也希望他能够从这里的经验中学习。
其他有用的生命周期阶段也缺失。例如,在示例中无法从Maven驱动测试。