将Groovy与Java集成

8
我目前正在将Groovy与现有的Java项目集成。 Groovy脚本基本上将XML解析为对象,然后使用现有的DAO进行保存、更新等操作。我有两个项目,一个是Groovy,一个是Java。使用Maven(我使用了gmaven插件),我首先构建Java项目,然后构建Groovy项目。
如果需要,我想能够从Java项目中调用Groovy脚本,反之亦然。我相信有一种方法可以做到这一点,但我无法实现。
例如,我的Java类是:
State(1 Field)
StateDAO

需要调用的Groovy脚本基本上是解析XML文档,然后使用DAO填充表格,并且目前我只希望它将数据发布到数据库中。

如果您有任何建议,请告诉我。谢谢!

3个回答

25

一般来说,将Groovy与Java集成有两种方法:

  1. 使Java代码在运行时编译和执行Groovy代码
  2. 将Groovy代码编译和打包为您的构建的一部分,就像您对Java代码所做的那样。

如果需要“脚本”解决方案并且要在运行时执行Groovy代码,请使用1。例如,该代码可以从数据库中加载或输入到GUI屏幕中。如果您只是想通过用Groovy编写应用程序的某些部分来简化生活,请选择2。其中两个典型示例是XML解析和测试(当然还有许多其他示例)。

假设您更感兴趣于2.,则可以将Groovy和Java分别编译或一起编译。如果将它们分开编译,则静态引用只能单向进行,就像您有两个Java模块一样。如果将它们一起编译,则可以任意混合Groovy和Java代码,就像它们都是同一模块中的Java代码一样。

将Java和Groovy代码一起编译是由Groovy编译器功能称为联合编译实现的。不幸的是,GMaven在联合编译方面存在严重问题,并且目前没有迹象表明这种情况会很快改变。对于较小的项目,您可能可以摆脱它,但对于较大的项目,它会使您受到困扰(我曾经遇到过这种情况)。有解决方案,但它们并非免费的。如果您愿意考虑(G)Maven的替代方案,请考虑切换到Gradle,它具有更好的Groovy支持。(免责声明:我是Gradle的开发人员之一。)

如果你决定坚持使用GMaven,请确保正确配置。我看到的几乎每个项目在这一步骤都失败了,而且通常没有意识到这一点。GMaven文档已经过时,但Groovy邮件列表包含有关此主题的多篇文章。您还可以从Spock(我的一个项目之一)中复制配置。
要启用GMaven联合编译,请添加generateStubs目标。只要您的项目在没有此目标的情况下编译,就可以将其省略。也有一个generateTestStubs目标,但很少需要使用。
这是简短的故事。有关长篇故事,请查看即将出版的Manning书籍Making Java Groovy。(我与作者无关。)

你是否使用过groovy-eclipse-compiler进行联合编译?它可以与maven-compiler-plugin进行连接。 - Emil Sit

5
对于彼得的建议,我整理了一些使用Java运行Groovy脚本的示例,在之前的博客文章中发布,并附有在github上的代码样本。 我也同意他关于GMaven和联合编译的评论 - 它能够工作,但可能会带来更多的问题。 考虑使用Gradle也是个不错的选择。虽然我大部分使用它进行生产时都是与Java源代码和Groovy测试代码一起使用,但到目前为止它一直表现出色。 祝你好运!

0
添加到答案#1,创建了GMaven plus,它改进了联合编译过程并具有良好的示例/文档poml文件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接