mingw / git bash shell中的jRuby问题
Posted
技术标签:
【中文标题】mingw / git bash shell中的jRuby问题【英文标题】:Problem with jRuby in mingw / git bash shell 【发布时间】:2011-06-10 18:18:36 【问题描述】:我在 windows 中从 mingw git bash shell 执行 jruby 时遇到问题。我下载了 jruby 1.6.2 的 windows 安装程序并运行它没有问题。如果我打开一个新的 Windows cmd shell,它似乎工作正常。我安装了 rake 和 sinatra gems;用了irb。输入 jruby -v 得到:
jruby 1.6.2 (ruby-1.8.7-p330) (2011-05-23 e2ea975) (Java HotSpot(TM) Client VM 1.6.0_24) [Windows 7-x86-java]
但是,当我打开 git mingw bash shell 并尝试对 jruby 执行任何操作时,我收到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jruby/Main
Caused by: java.lang.ClassNotFoundException: org.jruby.Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: org.jruby.Main. Program will exit.
我已经确定 jruby lib 目录在类路径中。
还有其他想法吗?
更新: 我认为问题在于最终调用 jruby bin 目录中的 jar 的 shell 脚本。
问题在于,虽然 msys 可以将 POSIX 转换为 Win 路径,但脚本会自行构建字符串,以便将类路径和其他信息传递给 jar。
看来这就是事情变得一团糟的地方。出于同样的原因,这些脚本特别具有处理 cygwin 的代码分支。我试图强制脚本认为它在 cygwin 下运行,但不幸的是脚本使用“cygpath”程序来获取路径,而这在 msys 中不可用
【问题讨论】:
这与***.com/questions/1534977/…有关吗? 我不这么认为。它似乎特定于 msysgit/mingw 在 cmd 中一切正常。我认为这一定是某种路径问题 如果我 cd 到 jruby 目录并执行 java -jar lib/jruby.jar -e "puts 'hello'" 它也可以工作。只是有它之外的问题 【参考方案1】:事实证明,这确实是 bash 脚本的“缺失功能”。我向 jruby jira 提交了一个 bug 并解决了
https://jira.codehaus.org/browse/JRUBY-5864
请注意,在撰写本文时,提交尚未成为可在 jruby 网站上下载的构建的一部分。但修复很简单。
这是提交:https://github.com/jruby/jruby/commit/8766f84b774ae5ae68204931bd4eab61b81a2056
只是将以下内容添加到 jruby.bash 文件顶部的 uname 大小写
MINGW*) jruby.exe "$@"; exit $?;;
【讨论】:
它现在在最新的二进制发行版中。【参考方案2】:诀窍是,mingw shell 可能不会从 Windows 环境中继承所有环境变量。
所以如果 java -jar lib/jruby.jar -e "puts 'hello
在 jruby 目录中工作,那么:
java -jar /full/path/to/jruby/lib/jruby.jar -e "puts 'hello
应该也可以。 如果不是,请仔细区分两组环境变量(正常的 DOS shell,它可以工作,而 mingw shell 不能)
也可以像difference of syntax for the classpath in a mingw environment 一样简单,像illustrated in this thread:
您的问题不在于路径未正确传递;就是你根本不允许它通过。 键入时,您的命令行包含一个不带引号的分号; 在任何与 Bourne 兼容的 shell 中,例如 作为 bash,不带引号的分号首先充当命令终止符,然后充当命令分隔符,因此您的命令行等效于两个单独的命令:
$ java.exe -classpath .
$ $DIR hello
[警告:我这里没有 Windows 框;以下未经测试]
你需要引用分号,AND(因为你现在已经引入了一个参数,它代表一个Win32原生格式的路径列表,所以它不会被翻译,你需要确保
DIR
也被定义为@ 987654327@ 不是DIR=/d/myClasses
):
$ java.exe -classpath .\;$DIR hello
或者,您需要完全以 UNIX 格式指定路径列表,(即使用冒号而不是分号作为单独的路径分隔符):
$ java.exe -classpath .:$DIR hello
【讨论】:
这是一个错误,我发布了修复作为答案。不过谢谢,您的回答让我走上了正轨。以上是关于mingw / git bash shell中的jRuby问题的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Windows 的 GIT bash mingw32 中激活 virtualenv