我正在使用 Grails 2.1.0,并且我编写了一个 Groovy 类,它不依赖于服务、控制器或任何其他 Grails 优点。它使用 Grails 类路径中已经存在的一些 .jar 库和其他类。
我想要:
- 运行 Groovy 类(或 Java 类,它不应该)使用 Grails 在其类路径中已经拥有的其他库/类(不是服务,不是控制器,都不是)。
- 能够访问命令行参数[这是必需的]
- 不需要引导整个 Grails 环境(我显然需要类路径,但仅此而已)
理想情况下,我希望能够做这样的事情:
java -classpath (I_HAVE_NO_IDEA_HOW_TO_DETERMINE_THIS) com.something.MyClass param1 param2 param3
我已经调查过的事情:
- 使用生成 Gant 脚本的“grails create-script”。
- 使用“grails 运行脚本”
第一个(使用 Gant 脚本)对我来说似乎非常错误。使用 Gant 脚本作为某种中间包装似乎需要引导整个 Grails 环境,而且我必须弄清楚如何获取对我想要调用的实际类的引用,这似乎很困难(但我不是 Gant高手,请赐教)。=)
第二个(使用run-script)有点工作......我以前使用过这种方法来调用服务方法,但它有两个问题:首先,它引导整个Grails环境;其次,似乎没有任何方法可以轻松传递命令行参数。
真的,我只想要类路径中的东西(和我的命令行参数),并且能够以最小的挫败感调用我的类的 main() 方法。话虽如此,如果您能想出一个解决问题的任何类型的工作示例(即使它涉及一些中间 Gant 或其他类),我将很乐意使用这种方法。
谢谢。
更新:适用于 Gant 任务的解决方案,如果有人有任何想法,仍然可以接受更好的想法......
在脚本/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用回车分隔;修复它作为练习留给读者。