使用CLASSPATH前缀调用groovy脚本如下工作正常:
CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
Run Code Online (Sandbox Code Playgroud)
但更改它以使用类路径arg不会:
groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')"
Run Code Online (Sandbox Code Playgroud)
并给出错误:
script_from_command_line: 1: unable to resolve class stuff.XMLUtils
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?(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
Run Code Online (Sandbox Code Playgroud)
使用-classpatharg,我在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
- ...
Run Code Online (Sandbox Code Playgroud)
使用该CLASSPATH=...版本显示上面的PWD条目被我在变量中设置的值替换.
如果我将调试添加到groovy shell可执行文件中,那么java调用的区别在于-classpatharg版本没有为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
Run Code Online (Sandbox Code Playgroud)
如果我删除包,并且对stuff失败示例的引用将正常工作.
自己回答这个问题是因为我找到了解决问题的方法。
我在 Fedora 中使用来自 yum 的默认 groovy 包,但是发现了许多问题(启动 groovysh 等时出错,无法找到 jline 包等),并且已经完全转向使用从 codehaus.org 下载的版本,并手动指定 GROOVY_HOME 和编辑改为调用下载的路径。
现在我所有的例子都按预期工作。
我使用的是 MSYS/Win32 + groovy 2.2 RC1 并且有另一个变化:
groovy -cp "./*" script.groovy // Works!
Run Code Online (Sandbox Code Playgroud)
但
groovy -cp some.jar script.groovy // ... not
Run Code Online (Sandbox Code Playgroud)
由于某种原因,虽然 some.jar 位于同一目录中,但上述内容在我的情况下不起作用。
| 归档时间: |
|
| 查看次数: |
11812 次 |
| 最近记录: |