2

我在 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 中不可用

4

2 回答 2

3

事实证明这确实是 bash 脚本的“缺失功能”。我向 jruby jira 提交了一个错误并已解决

https://jira.codehaus.org/browse/JRUBY-5864

请注意,在撰写本文时,该提交尚未成为可在 jruby 网站上下载的构建的一部分。但修复非常简单。

这是提交:https ://github.com/jruby/jruby/commit/8766f84b774ae5ae68204931bd4eab61b81a2056

它只是将以下内容添加到 jruby.bash 文件顶部的 uname case

MINGW*) jruby.exe "$@"; exit $?;;
于 2011-07-03T21:58:30.573 回答
1

诀窍是,mingw shell 可能不会从 Windows 环境中继承所有环境变量。
因此,如果 ajava -jar lib/jruby.jar -e "puts 'hello在 jruby 目录中工作,则:

java -jar /full/path/to/jruby/lib/jruby.jar -e "puts 'hello

应该也可以。
如果没有,请仔细区分两组环境变量(正常的 DOS shell,它可以工作,而 mingw shell 不能)


它也可以像mingw 环境中类路径的语法差异一样简单,如以下线程所示

您的问题不在于路径未正确传递;那是你根本不允许它通过。
键入时,您的命令行包含一个不带引号的分号;在任何与 Bourne 兼容的 shell(例如 bash)中,不带引号的分号首先充当命令终止符,然后充当命令分隔符,因此您的命令行等效于两个单独的命令:

$ java.exe -classpath .
$ $DIR hello

[警告:我这里没有 Windows 框;以下未经测试]

您需要引用分号 AND (​​因为您现在已经引入了一个表示 Win32 本机格式的路径列表的参数,因此它将免于翻译,您需要确保它DIR也定义为DIR=d:/myClassesNOT as DIR=/d/myClasses):

$ java.exe -classpath .\;$DIR hello

或者,您需要完全以 UNIX 格式指定路径列表(即使用冒号而不是分号作为单独的路径分隔符):

$ java.exe -classpath .:$DIR hello 
于 2011-06-11T14:58:16.040 回答