【问题标题】:Create a standalone groovy script with dependencies创建具有依赖项的独立 groovy 脚本
【发布时间】:2018-02-20 08:55:08
【问题描述】:

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

<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

我阅读了有关构建 uber-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

我知道我至少需要这个 ivy 依赖项:

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

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

【问题讨论】:

    标签: maven groovy uberjar


    【解决方案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 + Enter 并选择 @987654328 @ 选项。

    参考:Dependency management with Grape

    【讨论】:

    • 你好!这部分起作用了!当我在服务器上运行脚本时,仍然出现一个错误。请看我的编辑!
    • @xetra11 是否尝试将此依赖项作为@Grab('org.apache.ivy:ivy:2.4.0') 添加到您的脚本中? Grape 允许您添加多个依赖项。
    • 是的,我已经这样做了。没有任何变化,因为我认为脚本需要这些类来实际运行 @Grab 语句。
    • 你在服务器上使用什么 groovy 版本?它与您在本地计算机上使用的相同吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多