为什么groovy不使用classpath参数?

uqxowvwt  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(66)

如下所示使用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


有谁能解释一下为什么会这样吗?(.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,我在classloader中看不到传入classpath 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条目被我在变量中设置的值替换。
如果我将debug添加到groovy shell可执行文件中,java调用中的区别在于-classpath arg版本没有向java的classpath条目添加任何条目(这就是它给出class not found错误的最终原因),但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


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

cwtwac6a

cwtwac6a1#

我自己做这个是因为我找到了解决问题的办法。
我在fedora中使用yum的默认groovy包,但是发现了许多问题(启动groovysh等错误,无法找到jline包等),并且完全转移到使用从codehaus.org下载的版本,并手动指定GROOVY_HOME和编辑路径来调用下载的版本。
现在我的所有示例都按预期工作。

c9x0cxw0

c9x0cxw02#

我在MPEG4/Win32 + groovy 2.2 RC 1上,还有另一个转折:

groovy -cp "./*" script.groovy    // Works!

字符串

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


出于某种原因,尽管some.jar在同一个目录中,但在我的情况下,上面的内容不起作用。

e37o9pze

e37o9pze3#

这很奇怪。我只是试图重复你解释的问题,但一切似乎都很好(我在我的Ubuntu电脑上用Groovy-Version 1.8.6,1.7.7和1.7.0进行了测试)。
那么你使用的是哪个版本,你的操作系统是什么?
在Groovy Bug Tracker中,我发现了以下bug:Command line option for classpath (--cp/--classpath) is broken on Windows。但是这个bug只影响旧版本的Groovy(1.5.2,1.5.3和1.5.4)。所以也许Groovy的升级会帮助解决你的问题。
PS:通常我只是评论这一点,但不幸的是,我没有足够的点这样做:)。

相关问题