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