【问题标题】:How can I run a Groovy class from the command-line within a Grails environment?如何在 Grails 环境中从命令行运行 Groovy 类?
【发布时间】:2013-05-18 02:55:20
【问题描述】:

我正在使用 Grails 2.1.0,并且我编写了一个不依赖于服务、控制器或任何其他 Grails 优点的 Groovy 类。它使用 Grails 类路径中已经存在的一些 .jar 库和其他类。

我想:

  • 使用 Grails 在其类路径中已有的其他库/类(不是服务,不是控制器,都不是)运行 Groovy 类(或 Java 类,它不应该如此)。
  • 能够访问命令行参数[这是必需的]
  • 不需要引导整个 Grails 环境(我显然需要类路径,但别无其他)

理想情况下,我希望能够做这样的事情:

java -classpath (I_HAVE_NO_IDEA_HOW_TO_DETERMINE_THIS) com.something.MyClass param1 param2 param3

我已经研究过的事情:

  • 使用“grails create-script”生成 Gant 脚本。
  • 使用“grails 运行脚本”

第一个(使用 Gant 脚本)对我来说似乎非常错误。使用 Gant 脚本作为某种中间包装似乎需要引导整个 Grails 环境,而且我必须弄清楚如何获取对我想要调用的实际类的引用,这似乎很困难(但我不是 Gant高手,请赐教)。 =)

第二个(使用run-script)有点工作......我以前使用过这种方法来调用服务方法,但它有两个问题:首先,它引导整个Grails环境;其次,似乎没有任何方法可以轻松传递命令行参数。

真的,我只想要类路径中的东西(以及我的命令行参数),并且能够以最小的挫败感调用我的类的 main() 方法。话虽如此,如果您能想出一个解决问题的任何类型的工作示例(即使它涉及一些中间 Gant 或其他类),我将很乐意使用这种方法。

谢谢。


更新:适用于 Gant 任务的解决方案,如果有人有更好的想法,仍然开放......

scripts/FooBar.groovy

includeTargets << grailsScript("_GrailsInit")

target(main: "Runs a generic script and passes parameters") {
   def myclass = classLoader.loadClass('com.whatever.scripting.GenericRunScript') 
   myclass.execute(args);
}
setDefaultTarget(main)

src/groovy/com/whatever/scripting/GenericRunScript.groovy

package com.whatever.scripting
class GenericRunScript {
    public static execute(def args) {
        println "args=" + args.inspect()
    }
}

然后在命令行中,在 Grails 项目的根目录中:

$ grails compile 
| Environment set to development.....
| Compiling 2 source files.

$ grails foo-bar test one two
| Environment set to development....
args='test\none\ntwo'

注意1:我第一次做这个的时候,老是忘记编译语句,所以我把它加进去了。

注2:是的,args用回车分隔;修复这个问题留给读者作为练习。

【问题讨论】:

  • 嘿,您介意发布您的解决方案作为答案吗?这将使阅读和查找更容易。谢谢!
  • 确实,您必须用这种方法编译。 Grails 不会自动执行此操作,因为该类是使用 classLoader 加载的。但是,您可以在 FooBar.groovy 中将“编译”作为依赖项添加到您的目标。仅一行:depends(compile),遵循 4.1 中的示例。在 grails.org/doc/1.1.1/guide/4.%20The%20Command%20Line.html 中。它确实可以编译。
  • 另外,传递参数的另一种方法是使用 -Dproperty=value,然后使用 System.getProperty 检索它们。
  • 在使用 Grails 2.4.3 时,请参阅 stackoverflow.com/questions/23745917/… 以获取我的答案
  • 在 Grails 2.4.3 中运行并且 Tomcat 出现错误?见stackoverflow.com/questions/23745917/…

标签: java grails command-line gant


【解决方案1】:

http://grails.org/doc/latest/guide/commandLine.html 中所述,您可以包含目标_GrailsClasspath_GrailsArgParsing,以及您需要的任何其他内容。例如,如果您想在不创建第二个脚本的情况下解析命令行参数:

$ grails create-script ArgsScript
| Created file scripts/ArgsScript.groovy

现在编辑脚本 scripts/ArgsScript.groovy 如下:

includeTargets << grailsScript("_GrailsArgParsing") // grailsScript("_GrailsInit")

target(main: "The description of the script goes here!") {
    println argsMap
    for (p in argsMap['params']) 
      println p
}
setDefaultTarget(main)

查看结果:

$ grails args-script one two three=four
| Environment set to development....
[params:[one, two, three=four]]
one
two
three=four

更新:好吧,这并不像我想象的那么容易。基本上,您可以将脚本作为 Gant 任务运行,例如通过执行grails myscript,或作为脚本,例如通过做grails run-script src/groovy/MyScript.groovy。在第一种情况下,您可以访问参数,正如我已经解释过的,但是您仍然错过了一些 Grails 环境,这可能是一个错误。例如,您不能真正从 Gant 任务访问 src/groovy/ 中定义的脚本或类。另一方面,正如已经讨论过的,如果你使用run-script,你就不能得到参数。

但是,您可以使用 System.getProperty-Dproperty=value 语法传递命令行参数。另见Java system properties and environment variables

【讨论】:

    【解决方案2】:

    上述方式可行,但所有 grails 工具都将消失,包括域和依赖项。

    如果您需要在 grails 项目中定义的所有内容,那么 run-script 命令就可以解决问题

    grails run-script [你的 groovy 文件的路径]

    http://grails.org/doc/latest/ref/Command%20Line/run-script.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2016-05-01
      • 2018-07-15
      • 1970-01-01
      相关资源
      最近更新 更多