为什么';groovy是否使用类路径参数?

为什么';groovy是否使用类路径参数?,groovy,Groovy,按如下方式使用类路径前缀调用groovy脚本效果良好: CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')" 但将其更改为使用classpath arg不会: groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')" 并给出了错误: script_from_comm

按如下方式使用类路径前缀调用groovy脚本效果良好:

CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
但将其更改为使用classpath 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的条目(实际上,唯一的目录是当前工作目录),例如:

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

如果我将debug添加到groovy shell可执行文件中,java调用中的区别在于
-classpath
arg版本没有向java的classpath条目添加条目(这就是它给出类未找到错误的最终原因),但是
classpath=…
版本确实添加了路径

这是groovy中的一个bug吗

编辑:简单的失败示例

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

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

这很奇怪。我只是想重复你解释的问题,但一切似乎都很好(我在我的Ubuntu电脑上用Groovy版本1.8.6、1.7.7和1.7.0进行了测试)

那么您使用的是哪个版本,您的操作系统是什么

在Groovy Bug跟踪器中,我发现了以下Bug:。但是这个bug只会影响Groovy的旧版本(1.5.2、1.5.3和1.5.4)。因此,Groovy的升级可能有助于解决您的问题


PS:通常我只会对此进行评论,但不幸的是,我没有足够的分数来进行评论:)。

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

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


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

我使用的是MSYS/Win32+groovy 2.2 RC1,还有另一个问题:

groovy-cp“/*”script.groovy//很有效

groovy-cp some.jar script.groovy/。。。不是


出于某种原因,以上这些都不适用于我。

我使用的是Linux,Fedora 15。groovy
groovy版本:1.8.0 JVM:1.6.0_22
@Mark官方网站上还没有groovy版本1.8.0,因此我无法帮助您。我还使用groovy 1.8.2版进行了测试,但一切正常。所以我建议您升级groovy。问候您是否尝试向正在测试的脚本添加程序包?如果我删除package语句并使所有内容都处于默认的包级别,我就能够成功地运行
-classpath
classpath=…
,但是只要我将
包的内容添加到顶部并进行编译,groovy似乎就无法在
-classpath
参数中找到它。我在另一台运行1.8.4的机器上尝试过这个,但仍然存在相同的问题。我已经用一个详细的例子更新了我的问题。很抱歉,你的例子(带有
包内容
语句)在我的机器上运行良好。。。
- - - - 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