gpt4 book ai didi

Groovy 脚本不再在 Cygwin 下工作?

转载 作者:行者123 更新时间:2023-12-04 20:42:08 24 4
gpt4 key购买 nike

在旧版本的 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 中运行的底层进程实际上被混淆了 window 路径!显然它期待一个 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 的提示。

最佳答案

I'm not sure how Groovy is (a) resolving that to a windows-style path


startGroovy脚本中有特定的代码来检测 Cygwin 并使用 cygpath有必要的。

我是通过 installing Groovy via GVM 发现的,为 Unixy 平台获取 Groovy 的认可方式。 (在这种情况下,您不想使用 Groovy 的 native Windows 发行版!)

唯一棘手的事情是弄清楚如何设置 JAVA_HOME .在这里,它必须是:
 $ export JAVA_HOME='/cygdrive/c/Program Files (x86)/Java/jre7'

如果您使用的是 64 位版本的 Windows 并且像我一样安装了 32 位 JRE,那么这也应该适用于您。否则,您可能需要调整路径。

一旦我得到 gvm install groovy成功,你的 hiworld如果我将它作为 ./hiworld 运行,示例在这里运行良好.这是使用带有 Java 1.7.0_55 的 32 位版本的 Cygwin。

然而,当我把它放在 PATH并将其作为 hiworld 运行,正如您所做的那样,这传递了一条完全合格的路径到 groovy包装脚本(例如 /home/wyoung/bin/hiworld )而不是相对路径,这会导致 startGroovy通过 cygpath -m 运行路径的脚本,这会变成类似 C:/cygwin64/home/wyoung/bin/hiworld . Oracle 的 JRE 无法处理本地路径中的正斜杠。它盲目地假设 Windows 上的正斜杠意味着它是某种 URL,所以 C:被视为 URL 方案,或他们所说的“协议(protocol)”。

我不知道这是 Java 还是 startGroovy 中的回归。脚本。虽然你可以通过 file://正如您在此处发现的 URL,您还可以使用反斜杠而不是正斜杠传递“正确的”Windows 路径。你可以从 cygpath-w切换而不是 -m .在这种情况下,您必须更加小心避免意外的反斜杠转义,这可以解释回归。

关于Groovy 脚本不再在 Cygwin 下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24303057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com