【问题标题】:How to invoke groovy with 'java' from command line如何从命令行使用“java”调用 groovy
【发布时间】:2010-09-27 14:13:43
【问题描述】:

我必须将一些 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”。

【问题讨论】:

    标签: java command-line groovy


    【解决方案1】:

    您有 here 另一个从 Java 调用的 Groovy 应用程序示例(在本例中,来自 ant,但总体思路是相同的)。

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

    正如 frankowyer 所提到的,您在 java.lang.jar 的类路径参数中明确列出了确切的 groovy jar。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        避免不同机器上的不同类路径出现问题的一种方法是将所有必要的依赖项捆绑到一个 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
        

        【讨论】:

        • GroovyWrapper 使用 Ant 将 groovy 脚本构建到 jar 文件中。此构建也可以通过 Gradle 方式完成。如果有人喜欢,请参阅 this answer
        【解决方案4】:

        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”的路径(点和分号):因为路径需要你所在的基本文件夹来查找主类(看起来很奇怪)

        【讨论】:

        • 这应该是评论,而不是单独的答案!
        【解决方案5】:

        小心 [~]!

        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,一切正常。

        【讨论】:

          猜你喜欢
          • 2015-12-19
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 2016-04-02
          • 1970-01-01
          相关资源
          最近更新 更多