如何从命令行使用'java'调用groovy

时间:2008-12-18 19:22:29

标签: java command-line groovy

我必须将一些groovy代码发送给一些只安装了java的用户(没有grooy,没有$ groovy_home等)。我试图从命令行调用groovy,但我没有运气。这是我的bat文件:

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'。

5 个答案:

答案 0 :(得分:14)

你有一个从Java调用的另一个Groovy应用程序示例(在这种情况下,来自ant,但总的想法是相同的)。

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

正如frankowyer所提到的,你在java的classpath参数中明确列出了确切的groovy jar。

由于您的客户没有特殊的环境变量,只需将%GROOVY_HOME%/...替换为完整路径:

  • groovy.jar或
  • here(尽量减少与其他图书馆的冲突)

答案 1 :(得分:9)

我认为您需要在类路径中明确列出groovy jar

答案 2 :(得分:8)

避免不同机器上不同类路径出现问题的一种方法是将所有必需的依赖项捆绑到一个jar中,这样也可以更轻松地分发给用户。这可以通过这个'GroovyWrapper'脚本完成。默认情况下,默认情况下包含默认的jar(embeddable / 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脚本,只需运行:

$ java -jar HelloWorld.jar

答案 3 :(得分:1)

VonC的伟大答案:

  

.......由于您的客户没有特殊的环境变量,   只需将%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'的路径。 (点和分号):因为路径需要你找到主类的基础文件夹(看起来很奇怪)

答案 4 :(得分: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

在第一行中,波浪不会被bash处理,而java无法理解它。

在第二行中,波浪号替换为bash,一切正常。