为什么';groovy是否使用类路径参数?
按如下方式使用类路径前缀调用groovy脚本效果良好:为什么';groovy是否使用类路径参数?,groovy,Groovy,按如下方式使用类路径前缀调用groovy脚本效果良好: 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_comm
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只是我编译到/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的条目(实际上,唯一的目录是当前工作目录),例如:
使用CLASSPATH=…
版本显示上面的PWD条目被我在变量中设置的值替换
如果我将debug添加到groovy shell可执行文件中,java调用中的区别在于-classpath
arg版本没有向java的classpath条目添加条目(这就是它给出类未找到错误的最终原因),但是classpath=…
版本确实添加了路径
这是groovy中的一个bug吗
编辑:简单的失败示例
- - - - 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
如果我删除包和对
东西的引用
,失败的示例将正常工作。这很奇怪。我只是想重复你解释的问题,但一切似乎都很好(我在我的Ubuntu电脑上用Groovy版本1.8.6、1.7.7和1.7.0进行了测试)
那么您使用的是哪个版本,您的操作系统是什么
在Groovy Bug跟踪器中,我发现了以下Bug:。但是这个bug只会影响Groovy的旧版本(1.5.2、1.5.3和1.5.4)。因此,Groovy的升级可能有助于解决您的问题
PS:通常我只会对此进行评论,但不幸的是,我没有足够的分数来进行评论:)。我自己回答这个问题,因为我找到了解决问题的方法 我在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/。。。不是
出于某种原因,以上这些都不适用于我。我使用的是Linux,Fedora 15。groovy
groovy版本:1.8.0 JVM:1.6.0_22
@Mark官方网站上还没有groovy版本1.8.0,因此我无法帮助您。我还使用groovy 1.8.2版进行了测试,但一切正常。所以我建议您升级groovy。问候您是否尝试向正在测试的脚本添加程序包?如果我删除package语句并使所有内容都处于默认的包级别,我就能够成功地运行-classpath
或classpath=…
,但是只要我将包的内容添加到顶部并进行编译,groovy似乎就无法在-classpath
参数中找到它。我在另一台运行1.8.4的机器上尝试过这个,但仍然存在相同的问题。我已经用一个详细的例子更新了我的问题。很抱歉,你的例子(带有包内容语句)在我的机器上运行良好。。。
- - - - 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