为什么不groovy使用classpath参数?

时间:2012-02-22 11:57:42

标签: groovy

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

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

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

groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')"

并给出错误:

script_from_command_line: 1: unable to resolve class stuff.XMLUtils

任何人都能解释为什么会这样吗? (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

使用-classpath arg,我在类路径中看不到传入的类路径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
- ...

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

如果我向groovy shell可执行文件添加调试,那么java调用的不同之处在于-classpath arg版本没有为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

如果我删除了包和对stuff的引用,则失败的示例将正常工作。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

我在MSYS / Win32 + groovy 2.2 RC1上,还有另一个转折:

groovy -cp“./*”script.groovy // Works!

groovy -cp some.jar script.groovy // ... not

出于某种原因,上述情况都不适用于我的情况。

答案 2 :(得分:0)

那很奇怪。我只是试图重复你解释的问题,但一切似乎都运行正常(我在我的Ubuntu计算机上使用Groovy-Version 1.8.6,1.7.7和1.7.0进行了测试)。

您使用的是哪个版本以及您的操作系统是什么?

在Groovy Bug Tracker中,我发现了以下错误:Command line option for classpath (--cp/--classpath) is broken on Windows。但是这个bug只会影响旧版本的Groovy(1.5.2,1.5.3和1.5.4)。因此,Groovy的升级可能有助于解决您的问题......

PS:通常情况下我会对此发表评论,但不幸的是,我没有足够的分数来做这件事:)。