2008-12-18 100 views
14

我必須將一些groovy代碼發送給一些只安裝了java的用戶(沒有grooy,沒有$ groovy_home等)。我試圖從命令行調用groovy,但我沒有運氣。這是我的bat文件:如何使用'java'從命令行調用groovy

java -classpath .;lib;bin;bin-groovy introspector.AclCollector 

這是我的例外:

Exception in thread "main" java.lang.NoClassDefFoundError: groovy/lang/GroovyObject 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:621) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:56) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     ... 12 more 
Could not find the main class: introspector.AclCollector. Program will exit. 

沒有人有線索?我在\ lib目錄下有'groovy-all-1.6-beta-1.jar'。

回答

9

我想你需要明確列出了常規的jar在classpath

14

你有here從Java稱爲Groovy中應用的另一個例子(在這種情況下,螞蟻,但總的想法是一樣的)。

java -cp [...];%GROOVY_HOME%/embeddable/groovy-all-1.5.4.jar;[..] 

正如frankowyer所提到的,您具有在java的classpath參數中明確列出的確切groovy jar。

因爲你的客戶沒有特殊的環境變量,只是給的完整路徑替換%GROOVY_HOME%/...

8

避免不同機器上不同類路徑出現問題的一種方法是將所有必需的依賴關係捆綁到一個jar中,這也會使用戶更容易分發。這可以通過這個'GroovyWrapper'腳本完成。默認情況下,腳本中包含默認jar(可嵌入/ groovy-all- .jar和lib/commons .jar),如果您需要其他JARS,則可以輕鬆添加它們。

有關完整的腳本和說明,請參閱http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript

這裏的GroovyWrapper如何使用的例子:

說你有Groovy腳本HelloWorld.groovy,使用GroovyWrapper建設的HelloWorld.jar如下:

$ groovy GroovyWrapper -c -m HelloWorld 

GroovyWrapper將編譯將HelloWorld.groovy腳本移植到HelloWorld.class中,並創建一個可自行執行的jar HelloWorld.jar。

現在你可以使用的HelloWorld.jar用於啓動的HelloWorld腳本,只需運行:由VonC

$ java -jar HelloWorld.jar 
+1

`GroovyWrapper`使用`Ant`將groovy腳本構建成一個jar文件。這個構建也可以在`Gradle`方法中完成。參見[這個答案](http://stackoverflow.com/a/9749869/2011291 )如果有人喜歡它。 – AvatarQing 2014-12-06 11:28:13

1

GREAT答:

.......因爲你的客戶沒有特殊的環境變量, 只是取代%GROOVY_HOME%/ ...與以完整的路徑:

groovy.jar or 
goovy-all-VERSION.jar (to minimize any conflict with other libraries)........ 

這對於Windows Vista:

在系統屬性|環境變量|用戶變量: 變量名GROOVY_HOME設置爲C:\groovy\Groovy-1.8.5 和變量名CLASSPATH值的設定,包括.;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

不要犯錯誤我做(紡紗我的車輪位),不預習無休止的路徑'groovy-all'with「。」;「 (點號和分號):由於路徑需要您找到主類的基礎文件夾(看起來很奇怪)

+1

這應該是一個評論,而不是一個單獨的答案! – durron597 2012-10-26 21:23:23

0

請注意[〜]!

java -cp .:~/path-to-groovy-all.jar YourClassName  # does not work 
java -cp ~/path-to-groovy-all.jar:. YourClassName  # works 
java -cp .:/full/path/to/goovy-all.jar YourClassName # works 

第一行tilde不是由bash處理的,java不能理解它。

第二行代字符被bash代替,一切正常。