首页 文章

为什么不groovy使用classpath参数?

提问于
浏览
6

使用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 回答

  • 0

    自己回答这个问题,因为我找到了问题的解决方案 .

    我在fedora中使用了yum的默认groovy包,但发现了许多问题(错误启动groovysh等,无法找到jline包等),并且完全转移到使用codehaus.org下载的版本,并手动指定GROOVY_HOME并编辑改为调用下载的路径的路径 .

    现在我的所有示例都按预期工作 .

  • 3

    我在MSYS / Win32 groovy 2.2 RC1上有另一个转折点:

    groovy -cp“./*”script.groovy //工作!

    groovy -cp some.jar script.groovy // ...不是

    出于某种原因,上述情况都不适合我的情况 .

  • 4

    真奇怪 . 我只是试图重复你解释的问题,但一切似乎都运行正常(我在我的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:通常我会评论这个,但不幸的是我没有足够的分数来做这个:) .

相关问题