使用 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 脚本来转储类加载器
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
的引用失败的例子可以正常工作。
最佳答案
自己回答这个问题是因为我找到了解决问题的方法。
我在 Fedora 中使用来自 yum 的默认 groovy 包,但是发现了许多问题(启动 groovysh 等时出错,无法找到 jline 包等),并且已经完全转向使用从 codehaus.org 下载的版本,并手动指定 GROOVY_HOME 和编辑改为调用下载的路径。
现在我所有的例子都按预期工作。
关于groovy - 为什么 groovy 不使用类路径参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394305/