mingw / git bash shell中的jRuby问题

时间:2011-06-10 18:18:37

标签: windows-7 jruby mingw msys

我在windows中使用mingw git bash shell执行jruby时遇到问题。我下载了jruby 1.6.2的Windows安装程序并运行它没有问题。如果我打开一个新的Windows cmd shell它似乎工作正常。我安装了耙子和sinatra宝石;用过irb。输入jruby -v gets:

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

2 个答案:

答案 0 :(得分:3)

原来确实是bash脚本的“缺失功能”。我向jruby jira提交了一个错误并且已经解决了

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

请注意,截至撰写本文时,提交尚未成为可在jruby网站上下载的版本的一部分。但修复很简单。

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

所有这一切都是将以下内容添加到jruby.bash文件顶部的uname案例中

MINGW*) jruby.exe "$@"; exit $?;;

答案 1 :(得分:1)

诀窍是,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已定义作为DIR=d:/myClasses而不是DIR=/d/myClasses):

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

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

$ java.exe -classpath .:$DIR hello