Grails与Maven:一段不和谐的婚姻

工程 | Dave Syer | 2007年7月14日 | ...

简介

Grails 似乎正在蓬勃发展,并且看起来它确实“有腿”,就像人们常说的那样。我对在Web应用程序领域之外稍微伸展一下这些腿非常感兴趣。如果您了解我在Spring Batch方面的工作,您可能就能猜到这会把我带到哪里。但是在这篇文章中,我只想分享一些我在Grails应用程序的基本、底层部署和构建方面的一些经验。

我对Maven 2有一种爱恨交加的情感,我正在学习爱上Grails,但遗憾的是,这两个工具之间并不特别兼容。如果能看到更紧密的集成,那将是非常好的。Maven并不总是我们想要的全部,但有些事情确实让它物有所值。它是一种标准(无论你喜欢与否),所以当我从某个地方下载一个项目时,我已经知道如何构建它,它的依赖项是什么以及文档在哪里。Grails具有一些相同的功能,实际上还包含了自己的基于Groovy脚本的Ant的相当复杂的构建工具。也许有一种折中的方法,我们可以兼得两者的优势?

我还了解到该领域的一些其他活动,我希望我们能够围绕某些东西达成共识(也许是由这个论坛和Grails JIRA中的讨论驱动的)。例如,参见Frederick Verbist的博客和Arnaud Heritier的Maven集成项目(目前还处于起步阶段)。Grails团队传统上对Maven印象不佳(例如,参见此处),但我与Graeme Rocher进行了交谈,他愿意接受建议,所以我希望我们能够在这里取得一些进展。

使用Maven的Grails原型依赖项管理

本着朝着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,我的王国换一个POM……

当第一次面对Grails项目并试图理解它如何组合在一起时,这是一个疯狂的Maven用户的呼声。希望我们在这里能展示如何让这个可怜的疯狂的人冷静下来。为此,我们提供了一些简单的步骤来为现有的Grails项目创建一个Maven项目。

在附带的沙箱存档中,有三个pom,每个pom都在其自己的项目中

  • base = 与Web应用程序无关的依赖项的基本POM。我对此非常宽容(例如,包括Spring Weblfow)。目标是您应该能够仅使用这些依赖项启动Grails控制台。
  • web = 创建Web应用程序的WAR文件所需的额外依赖项。这在某种程度上可能依赖于平台,但此处包含的依赖项将在Servlet 2.4容器(如Jetty 5.1)中工作(这是Grails传统上使用的)。
  • launch = 仅用于在独立或开发环境中启动Web应用程序的Jetty和JSP依赖项

要安装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打包中(如果已实现)。

仅限Eclipse用户

测试项目还包括Eclipse项目工件 - 使用Maven Eclipse扩展以获得最佳结果(http://m2eclipse.codehaus.org/update-dev/)。使用此Eclipse扩展,您将能够处理工作区中其他作为Maven工件的项目,如果它们是Grails项目的依赖项,则它们将自动添加到类路径中,并在您进行更改时动态更新。

如果您不使用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应用程序中还是在依赖项目中。

下一步是什么

我附加的工具缺少/不方便的一些内容。它们仍在开发中。如果有人尝试使用它们,他们无疑会对如何做得更好提出建议。请在此处或在Grails JIRA上回复。

以下是一些已知问题或烦恼

Grails打包时的重复Jar

核心中的某些Grails依赖项可能与pom中的依赖项不同或名称不同(Grails pom或项目pom)。当您执行“grails package”时,它会将jar从GRAILS_HOME/lib复制到web-app/WEB-INF/lib中,并且无法防止重复。例如,在Grails未使用完全限定的jar名称的任何地方,您都会在WEB-INF/lib中看到重复项。

问题在于Maven依赖项插件不允许我们排除提供的依赖项(目前是这样),因此当您执行“mvn package”时,所有Grails依赖项最终都会出现在./lib中。这对Grails开发人员来说并不舒服,因为它们通常是从GRAILS_HOME/lib复制的。理想情况下,这种争端将在我们能够说我们真正拥有Maven-Grails集成之前得到解决。

缺少其他Maven生命周期阶段

简单的演示为Grails提供了一个clean和package生命周期增强。我们希望能够使用Maven为我们完成更多开发和持续集成工作。

例如,我们希望从Grails项目布局构建WAR文件。使用Ant和Maven实现这一点并不困难。理想情况下,它将作为Maven插件实现 - 基本上这就是Arnaud的项目,所以我希望他能够取得一些进展,但也希望他能够从这里的经验中学习。

其他有用的生命周期阶段也缺失。例如,在示例中无法从Maven驱动测试。

Grails打包周期

Grails和Maven都有各自的“package”周期。通常,Grails周期只需要发生一次(在清理之间),但仍然令人恼火的是必须记住执行它。

Eclipse的Groovy插件

在 .groovy 源代码中拥有语法高亮显示功能固然很好,但除此之外,Groovy 插件似乎只会带来麻烦。这与 Maven 或 Grails 本身都没有关系,但众所周知,它会给其他 Grails Eclipse 用户带来问题。例如,如果您编辑控制器或服务,您可能会看到一条恼人的警告消息,询问您是否要终止应用程序。Groovy 插件检测到更改,而 Eclipse 无法处理类路径的更改。但 Grails 可以,因此通常您可以点击“继续”按钮。但并非总是如此。关闭项目属性中的 Groovy 编译是安全的,但这样您就会失去非 grails-app 类别的动态编译功能。
附件再次提醒:点击这里

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部