Groovy脚本不再适用于Cygwin?
在旧版本的Groovy中,我可以在Cygwin下运行Groovy作为
shell脚本,遵循他们自己的
instructions:
$cat ~/bin/hiworld #!/usr/bin/env groovy println("Hello world") 这很有效.但是,在(至少)Groovy 2.3.2和2.3.3下,我看到的是: $hiworld Caught: java.net.MalformedURLException: unknown protocol: c java.net.MalformedURLException: unknown protocol: c 我在黑暗中最好的刺:“env”通过绝对路径启动脚本(例如“groovy / home / myacct / bin / hiworld”),而新版本的Groovy已被“改进”,以便Groovy不再理解如何处理这个. 实际上,我可以通过这样做产生同样的错误: $groovy ~/bin/hiworld Caught: java.net.MalformedURLException: unknown protocol: c java.net.MalformedURLException: unknown protocol: c 所以我不确定Groovy是如何(a)将其解析为Windows风格的路径,然后(b)无法理解它是一种Windows风格的路径. 我可以“修复”这个,然后通过这样运行它: $groovy $(cygpath -w ~/bin/hiworld) Hello world …但是,来吧,这是让用户启动实用程序脚本的完全疯狂方式. (或者我可以编写一个“前端”脚本,当然只是用那条线来启动另一个脚本.但是,对于我想要最终实现的目标,我不妨放弃Groovy并分发一个可运行的脚本.带有相关启动脚本的JAR.) 那么Groovy是否只是放弃了对Cygwin的支持?或者它们是否真的有可能至少有两个版本没有测试他们自己推荐的在最流行的环境之一下运行脚本的方式? 如果没有,我错过了什么或做错了什么? 更新:我认为备份我在这里提出的一些建议会有所帮助. 首先,我想要注意Cygwin显然是(或者是)至少得到了一些支持:例如,groovyStart在支持Cygwin平台方面有相当多的代码(看起来和Mac OSX一样多).如前所述,它在以前的版本中显然工作正常. 目前,最后一个示例在groovyStart下解析为: '/cygdrive/c/Program Files/Java/jdk1.7.0_51/bin/java' -classpath C:/cygwin64/home/myacct/opt/groovy-2.3.3/lib/groovy-2.3.3.jar -Dscript.name=/home/myacct/opt/groovy-2.3.3/bin/groovy -Dprogram.name=groovy -Dgroovy.starter.conf=C:/cygwin64/home/myacct/opt/groovy-2.3.3/conf/groovy-starter.conf -Dgroovy.home=C:/cygwin64/home/myacct/opt/groovy-2.3.3 '-Dtools.jar=C:/Program Files/Java/jdk1.7.0_51/lib/tools.jar' org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain --conf C:/cygwin64/home/myacct/opt/groovy-2.3.3/conf/groovy-starter.conf --classpath . C:/cygwin64/home/myacct/bin/hiworld 只是为了澄清一下,调用JDK本身没有问题 – 运行命令的那部分运行就好了.被打破的部分是最后一个论点:如果我改变了 C:/cygwin64/home/myacct/bin/hiworld 至 file:///C:/cygwin64/home/myacct/bin/hiworld ……它再次起作用.这与我上面的断言一致,“groovy”(脚本)确实正确地从Cygwin / UNIX样式路径转换为本机Windows路径,但底层进程 – 在Windows Java中运行 – 实际上是因为窗口路径!显然它期待一个URL. 更新2:下面,Warren提出了尝试使用GVM的绝佳建议.可悲的是,这仍然会产生同样的错误: $which groovy /home/myacct/.gvm/groovy/current/bin/groovy $hiworld Caught: java.net.MalformedURLException: unknown protocol: c java.net.MalformedURLException: unknown protocol: c $sh $(which groovy) ~/bin/hiworld Caught: java.net.MalformedURLException: unknown protocol: c java.net.MalformedURLException: unknown protocol: c 将“-x”标志添加到上一个命令会显示Groovy仍在使用我的Windows JVM(这没有错,只是注意到)并且现在引用了GVM安装的库(此处显示为了可读性而略微重新格式化): '/cygdrive/c/Program Files/Java/jdk1.7.0_51/bin/java' -classpath C:/cygwin64/home/myacct/.gvm/groovy/2.3.3/lib/groovy-2.3.3.jar -Dscript.name=/home/C400334/.gvm/groovy/current/bin/groovy -Dprogram.name=groovy -Dgroovy.starter.conf=C:/cygwin64/home/myacct/.gvm/groovy/2.3.3/conf/groovy-starter.conf -Dgroovy.home=C:/cygwin64/home/myacct/.gvm/groovy/2.3.3 '-Dtools.jar=C:/Program Files/Java/jdk1.7.0_51/lib/tools.jar' org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain --conf C:/cygwin64/home/myacct/.gvm/groovy/2.3.3/conf/groovy-starter.conf --classpath . C:/cygwin64/home/myacct/bin/hiworld 和以前一样,在最终参数之前添加“file:///”似乎可以解决问题. 所以我想知道我们是否正在使用不同版本的JVM或其他东西? 更新3:升级到jdk1.7.0_60(尝试了64位和32位版本),但这似乎没有什么区别. Java 6表现出同样的问题,但也增加了对缺少NioGroovyMethods的抱怨. 解决方法
startGroovy脚本中包含特定代码,用于检测Cygwin并根据需要使用cygpath. 我在installing Groovy via GVM年发现了这个,这是获得针对Unixy平台的Groovy的批准方式. (在这种情况下,您不希望使用Groovy的本机Windows发行版!) 唯一棘手的问题是弄清楚如何设置JAVA_HOME.在这里,它需要是: $export JAVA_HOME='/cygdrive/c/Program Files (x86)/Java/jre7' 如果您使用的是64位版本的Windows并且安装了32位JRE,那么这对您也有用.否则,您可能需要调整路径. 一旦我得到gvm安装groovy成功,你的hiworld示例在这里工作得很好,如果我把它作为./hiworld运行.这是使用32位版本的Cygwin和Java 1.7.0_55. 但是,当我把它放在PATH中并将其作为hiworld运行时,就像你正在做的那样,它传递了一个完全限定的路径到groovy包装器脚本(例如/ home / wyoung / bin / hiworld)而不是相对路径,导致startGroovy脚本通过cygpath -m运行路径,将其转换为C:/ cygwin64 / home / wyoung / bin / hiworld. Oracle的JRE无法处理本地路径中的正斜杠.它盲目地假设Windows上的正斜杠意味着它是某种类型的URL,因此C:被视为URL方案,或者它们放置的“协议”. 我不知道这是Java中的回归还是startGroovy脚本中的回归.虽然您可以在此处发送文件:// URL,但您也可以使用反斜杠而不是正斜杠传递“正确”的Windows路径.你可以使用-w开关而不是-m从cygpath获得.在这种情况下,你必须更加小心避免意外的反斜杠逃逸,这可以解释回归. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |