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

在git bash 中配置git用户名和邮箱及查看配置信息

git bash返回上一级目录

SSH、shell、Xshell 、bash、Git、Git bash 、Git CMD、Git shell

git,git bash和git shell有啥区别

结合mingw和git