使用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,我在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
- ...
使用 CLASSPATH=...
版本显示上面的PWD条目被我在变量中设置的值替换 .
如果我将调试添加到groovy shell可执行文件中,那么java调用的不同之处在于 -classpath
arg版本没有为java 's classpath entry (which is ultimately why it'添加条目,从而没有找到类错误),但 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 回答
自己回答这个问题,因为我找到了问题的解决方案 .
我在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 // ...不是
出于某种原因,上述情况都不适合我的情况 .
真奇怪 . 我只是试图重复你解释的问题,但一切似乎都运行正常(我在我的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:通常我会评论这个,但不幸的是我没有足够的分数来做这个:) .