14

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

4

5 回答 5

14

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

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

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

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

于 2008-12-18T20:00:35.193 回答
9

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

于 2008-12-18T19:25:48.600 回答
8

避免不同机器上不同类路径问题的一种方法是将所有必要的依赖项捆绑到一个 jar 中,这也将使分发给用户更容易。这可以通过这个“GroovyWrapper”脚本来完成。默认情况下,脚本中包含默认 jars(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
于 2011-08-02T15:50:01.393 回答
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'的路径 (点和分号):因为路径需要您所在的基本文件夹来查找主类(看起来很奇怪)

于 2012-02-04T08:30:31.397 回答
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 取代,一切正常。

于 2014-08-05T12:02:44.960 回答