【问题标题】:Run groovy script from within gradle从 gradle 中运行 groovy 脚本
【发布时间】:2011-01-22 13:30:24
【问题描述】:

创建运行 groovy 脚本的 gradle 任务的最佳方法是什么?我意识到 gradle 构建文件很时髦,所以我认为可以做这样的事情:

task run << {
    Script app = new GroovyShell().parse(new File("examples/foo.groovy"))
    // or replace .parse() w/ a .evalulate()?
    app.run()
}

如果 bar.groovy 使用 @Grab 注释甚至进行简单的导入,我在尝试此操作时会遇到各种奇怪的错误。我想创建一个 gradle 任务来处理这个问题,以便我可以希望重用类路径定义。

examples 目录移动到 src 目录中的某个地方会更好吗?最佳做法是什么?

【问题讨论】:

    标签: groovy gradle groovyclassloader


    【解决方案1】:

    或者你可以这样做:

    new GroovyShell().run(file('somePath'))
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用 GroovyScriptEngine 代替 GroovyShell。我以前使用过 @Grab 注释。您将需要类路径上的所有 groovy,groovy-all.jar 是不够的。我猜 Ivy 没有打包在 groovy-all.jar 中。像这样的东西应该是诀窍:

      此脚本假定 /tmp/HelloWorld.groovy 中的 groovy 脚本

      def pathToFolderOfScript = '/tmp'
      def gse = new GroovyScriptEngine([pathToFolderOfScript] as String[])
      gse.run('HelloWorld.groovy', new Binding())
      

      【讨论】:

        【解决方案3】:

        http://wayback.archive.org/web/20131006153845/http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-runningthingsfromGradle

        ant.java(classname: 'com.my.classname', fork: true,
                 classpath: "${sourceSets.main.runtimeClasspath.asPath}")
        

        【讨论】:

          【解决方案4】:

          我认为您可能需要将脚本作为新进程运行...例如,

          ["groovy","examples/foo.groovy"].execute()
          

          我猜 Gradle 的执行方式不是通过调用 groovy,所以使 @Grab 工作的设置永远不会发生。也可能是 Gradle 使用的 Groovy 版本不支持@Grab。

          【讨论】:

          • 与这里的其他建议不同,这个要求用户有一个独立的 Groovy 安装。 Gradle 不提供“groovy”、“groovy.bat”等。这对于使用 Gradle 构建的应用程序来说是不可接受的要求,因为使用 gradlew 甚至无需独立安装 Gradle 系统。
          猜你喜欢
          • 2013-06-25
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          • 1970-01-01
          • 2013-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多