【问题标题】:Why doesn't groovy use classpath argument?为什么 groovy 不使用类路径参数?
【发布时间】: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


    【解决方案1】:

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

    我在 fedora 中使用来自 yum 的默认 groovy 包,但是发现了许多问题(启动 groovysh 时出错等,无法找到 jline 包等),并完全转向使用从 codehaus.org 下载的版本,并手动指定GROOVY_HOME 和编辑路径来调用下载的。

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

    【讨论】:

      【解决方案2】:

      我正在使用 MSYS/Win32 + groovy 2.2 RC1 并且有另一个转折:

      groovy -cp "./*" script.groovy    // Works!
      

      但是

      groovy -cp some.jar script.groovy  // ... not
      

      出于某种原因,以上都不适用于我的情况。

      【讨论】:

        【解决方案3】:

        这很奇怪。我只是尝试重复您解释的问题,但一切似乎都正常(我在我的 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。但是这个错误只会影响旧版本的 Groovy(1.5.2、1.5.3 和 1.5.4)。所以也许升级 Groovy 将有助于解决您的问题...

        PS:通常我只是对此发表评论,但不幸的是我没有足够的积分来做这件事:)。

        【讨论】:

        • 我用的是Linux,Fedora 15。groovy的版本Groovy Version: 1.8.0 JVM: 1.6.0_22
        • @Mark 官方网站上还没有 groovy 版本 1.8.0,所以我无法帮助你。我还用 groovy 1.8.2 版进行了测试,但一切正常。所以我建议你升级groovy。问候
        • 您是否尝试将包添加到您正在测试的脚本中?我已经能够成功运行-classpathCLASSPATH=... 如果我删除包语句并将所有内容都置于默认包级别,但是只要我将package stuff 行添加到顶部并编译,groovy 就不会似乎用-classpath arg 找到它。我已经在另一台运行 1.8.4 的机器上试过这个,但仍然是同样的问题。我用一个详细的例子更新了我的问题。
        • 很抱歉,您的示例(带有package stuff 声明)在我的机器上运行良好...
        猜你喜欢
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多