创建一个包含依赖项的独立groovy脚本

时间:2018-02-20 08:55:08

标签: maven groovy uberjar

我有一个Groovy脚本,它依赖于RestFB:

<dependency>
  <groupId>com.restfb</groupId>
  <artifactId>restfb</artifactId>
  <version>2.0.0</version>
  <scope>runtime</scope>
</dependency>

我需要在另一台带有 groovy-shell 的机器上运行此脚本。当我这样做时,我得到以下错误:

 @ line 7, column 1.
   import com.restfb.json.ParseException
   ^

1 error

我读到了关于构建超级jar的方法,但从未找到一个展示如何做到这一点的好例子。有关如何处理此解决方案的分步指南将非常有用。

Szymon Stepniak的回答

我使用@Grab,它在我的开发机器上工作正常。当我切换到我的服务器时,会发生以下情况:

Caught: java.lang.NoClassDefFoundError: org/apache/ivy/core/report/ResolveReport
java.lang.NoClassDefFoundError: org/apache/ivy/core/report/ResolveReport
Caused by: java.lang.ClassNotFoundException: org.apache.ivy.core.report.ResolveReport

我知道我至少需要这种常春藤依赖:

<dependency>
  <groupId>org.apache.ivy</groupId>
  <artifactId>ivy</artifactId>
  <version>2.4.0</version>
</dependency>

但是我应该如何添加它以便脚本可以使用它?

1 个答案:

答案 0 :(得分:1)

如果涉及到具有依赖关系的Groovy脚本,你就不需要任何胖jar。 Groovy有一个名为Grape的内置机制,允许您将maven依赖项添加到脚本中。您所要做的就是在脚本的开头使用@Grab('dependency_def')注释,并且它是:

script.groovy

@Grab('com.restfb:restfb:2.0.0')

import com.restfb.json.ParseException

// do your stuff

现在您可以使用以下命令运行脚本:

groovy script.groovy

首次运行总是需要更多时间,因为Grape会解析并下载依赖项。下次运行的执行速度提高了几倍,因为已经下载了依赖项。

带有@Grab注释的Groovy脚本也可以在IDE中轻松运行,例如: IntelliJ IDEA有一个内置选项来获取注释并将它们添加到当前项目类路径:将光标移动到@Grab注释,按 Alt + 输入并选择Grab the artifacts选项。

  

参考:Dependency management with Grape