为什么不groovy使用classpath参数?

Mar*_*her 6 groovy

使用CLASSPATH前缀调用groovy脚本如下工作正常:

CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
Run Code Online (Sandbox Code Playgroud)

但更改它以使用类路径arg不会:

groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')"
Run Code Online (Sandbox Code Playgroud)

并给出错误:

script_from_command_line: 1: unable to resolve class stuff.XMLUtils
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?(stuff.XMLUtils只是我编译成/ path/to/classes的一些groovy脚本)

我做了一些调查,并使用以下groovy脚本转储类加载器

def printClassPath(classLoader) {
  println "$classLoader"
  classLoader.getURLs().each {url->
     println "- ${url.toString()}"
  }
  if (classLoader.parent) {
     printClassPath(classLoader.parent)
  }
}
printClassPath this.class.classLoader
Run Code Online (Sandbox Code Playgroud)

使用-classpatharg,我在classloader中看不到传入的类路径arg中的条目(实际上,唯一的目录是当前工作目录),例如:

groovy.lang.GroovyClassLoader$InnerLoader@4911b910
groovy.lang.GroovyClassLoader@18203c31
sun.misc.Launcher$AppClassLoader@35a16869
- file:/usr/share/java/ant.jar
- ... (removed for brevity)
- file:/home/admin/groovy/
sun.misc.Launcher$ExtClassLoader@77cde100
- file:/usr/java/jdk1.6.0_23/jre/lib/ext/sunjce_provider.jar
- ...
Run Code Online (Sandbox Code Playgroud)

使用该CLASSPATH=...版本显示上面的PWD条目被我在变量中设置的值替换.

如果我将调试添加到groovy shell可执行文件中,那么java调用的区别在于-classpatharg版本没有为java的类路径条目添加任何条目(这最终是为什么它给出了一个类未找到错误),但CLASSPATH=...版本确实添加了路径.

这是groovy中的一个错误吗?

编辑:简单的失败的例子

- - - - xu.groovy
package stuff
def printIt(string) { println string }
- - - -

groovyc -d classes xu.groovy
groovy -cp classes -e "(new stuff.xu()).printIt('test')"  # fails
CLASSPATH=classes groovy -e "(new stuff.xu()).printIt('test')"  # works
Run Code Online (Sandbox Code Playgroud)

如果我删除包,并且对stuff失败示例的引用将正常工作.

Mar*_*her 5

自己回答这个问题是因为我找到了解决问题的方法。

我在 Fedora 中使用来自 yum 的默认 groovy 包,但是发现了许多问题(启动 groovysh 等时出错,无法找到 jline 包等),并且已经完全转向使用从 codehaus.org 下载的版本,并手动指定 GROOVY_HOME 和编辑改为调用下载的路径。

现在我所有的例子都按预期工作。


Sim*_*hum 5

我使用的是 MSYS/Win32 + groovy 2.2 RC1 并且有另一个变化:

groovy -cp "./*" script.groovy    // Works!
Run Code Online (Sandbox Code Playgroud)

groovy -cp some.jar script.groovy  // ... not
Run Code Online (Sandbox Code Playgroud)

由于某种原因,虽然 some.jar 位于同一目录中,但上述内容在我的情况下不起作用。