【发布时间】:2012-02-22 11:57:42
【问题描述】:
使用 CLASSPATH 前缀调用 groovy 脚本可以正常工作:
CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
但将其更改为使用类路径参数不会:
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 的引用,失败的示例将正常工作。
【问题讨论】:
标签: groovy