2012-02-22 92 views
6

调用使用CLASSPATH前缀如下Groovy脚本正常工作:为什么groovy不使用classpath参数?

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只是一些常规的脚本我已经编入/路径/到/班 )

我已经做了一些调查,并使用以下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过去了,(其实,唯一的目录是当前工作目录)的条目,如:

[email protected] 
[email protected] 
[email protected] 
- file:/usr/share/java/ant.jar 
- ... (removed for brevity) 
- file:/home/admin/groovy/ 
[email protected] 
- file:/usr/java/jdk1.6.0_23/jre/lib/ext/sunjce_provider.jar 
- ... 

使用CLASSPATH=...版本显示, PWD入门abo ve被我在变量中设置的值所取代。

如果我将调试添加到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引用失败的例子将正常工作。

回答

4

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

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

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

0

这很奇怪。我只是试图重复你解释的问题,但似乎一切正常(我在我的Ubuntu计算机上使用Groovy-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:通常我只是会对此发表评论,但不幸的是我没有足够的积分来做到这一点:)。

+0

我使用的是Linux,Fedora 15. groovy的版本'Groovy版本:1.8.0 JVM:1.6.0_22'。 – 2012-02-27 09:34:18

+0

@Mark官方网站还没有一个常规版本1.8.0,所以我不能帮你。我也用groovy 1.8.2进行了测试,但一切正常。所以我建议你升级groovy。 Greetings – 2012-02-27 21:04:59

+0

您是否尝试将软件包添加到您正在测试的脚本中?我已经能够成功运行'-classpath'或'CLASSPATH = ...',如果我删除了package语句并将所有内容都放在默认包级别上,但是只要将'package stuff'行添加到顶部,并且编译时,groovy似乎没有用'-classpath' arg找到它。我在另一台运行1.8.4的机器上试过这个,但仍然是同样的问题。我用一个详细的例子更新了我的问题。 – 2012-02-27 21:11:01

3

我在MSYS /的Win32 +常规2.2 RC1,并有另一种扭曲:

常规-cp “./*” script.groovy //作品!

常规-cp some.jar script.groovy // ...不

出于某种原因,没有以上会在我的情况下工作了。

相关问题