簡體   English   中英

如何在Grails環境中從命令行運行Groovy類?

[英]How can I run a Groovy class from the command-line within a Grails environment?

我正在使用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項目的根目錄中的while:

$ 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由回車分開; 將這作為練習留給讀者。

http://grails.org/doc/latest/guide/commandLine.html中所述 ,您可以包含目標_GrailsClasspath_GrailsArgParsing ,以及您需要的任何其他內容。 例如,如果要在不創建第二個腳本的情況下解析命令行參數:

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

現在編輯腳本腳本/ 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 run-script src/groovy/MyScript.groovy 在第一種情況下,您可以訪問參數,正如我已經解釋的那樣,但您仍然會遺漏一些Grails環境,這可能是一個錯誤。 例如,您無法真正從Gant任務訪問src/groovy/定義的腳本或類。 另一方面,如前所述,如果使用run-script ,則無法獲取參數。

但是, 您可以使用System.getProperty-Dproperty=value語法傳遞命令行參數。 另請參閱Java系統屬性和環境變量

上述方式可行,但所有grails工具都將消失,包括域和依賴項。

如果您需要在grails項目中定義的所有內容,則run-script命令將執行此操作

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM