如何在Grails环境中从命令行运行Groovy类?

时间:2013-05-22 21:53:11

标签: java grails command-line gant

我正在使用Grails 2.1.0,我有一个Groovy类,我写的不依赖于服务,控制器或任何其他Grails的善良。它使用一些.jar库和已经在Grails类路径中的其他类。

我想:

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

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

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

我已经研究过的事情:

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

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

第二个(使用运行脚本)类型的工作...我之前使用过这种方法调用服务方法,但它有两个问题:首先,它引导整个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由回车分开;将这作为练习留给读者。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果您需要在grails项目中定义的所有内容,则run-script命令将执行此操作

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

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