Проблема с jRuby в оболочке mingw / git bash - PullRequest
2 голосов
/ 10 июня 2011

У меня проблема с выполнением jruby из оболочки mingw git bash в windows.Я скачал установщик Windows для Jruby 1.6.2 и запустил его без проблем.Если я открою новую оболочку Windows CMD, кажется, работает нормально.Я установил грабли и камни синатры;использовал ИКР.входя в 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 и пытаюсь что-нибудь сделать с 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 находится в пути к классам.

Есть еще идеи?

ОБНОВЛЕНИЕ: Я думаю, что проблема заключается в сценариях оболочки, которые в конечном итоге вызывают jar вКаталог jruby bin.

Проблема заключается в том, что хотя msys может преобразовывать пути POSIX в Win для большинства вещей, но скрипт создает собственные строки для передачи пути к классам и другой информации в jar.

Похоже, что здесь все запутано.Сценарии специально имеют ветви кода, которые имеют дело с cygwin по той же причине.Я попытался заставить сценарии думать, что он работает под управлением cygwin, но, к сожалению, сценарии используют программу «cygpath» для получения путей, которая недоступна в msys

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Оказывается, это была действительно "недостающая особенность" скриптов bash.Я отправил сообщение об ошибке в jruby jira, и оно было исправлено

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

Обратите внимание, что на момент написания этой статьи этот коммит не был частью сборки, доступной для загрузки навеб-сайт Jruby.Но исправить это было довольно просто.

Вот коммит: https://github.com/jruby/jruby/commit/8766f84b774ae5ae68204931bd4eab61b81a2056

Все, что нужно, это добавить следующее в случай uname в верхней части файла jruby.bash

MINGW*) jruby.exe "$@"; exit $?;;
1 голос
/ 11 июня 2011

Хитрость в том, что оболочка mingw может не наследовать все переменные среды из среды Windows.
Так что, если java -jar lib/jruby.jar -e "puts 'hello работает в каталоге jruby, то:

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

должно работатьа также.
Если нет, то аккуратно рассмотрите два набора переменных окружения (обычная оболочка DOS, где она работает, и оболочка mingw, где она не работает)


Это также может быть так же простокак разница синтаксиса для пути к классам в среде mingw , как , проиллюстрированное в этой теме :

Ваша проблема не в том, что путь непроходить правильно;это то, что вы вообще не разрешили его передавать.
Как напечатано, ваша командная строка содержит точку с запятой без кавычек; в любой совместимой с Bourne оболочке, такой как bash, точка с запятой без кавычек действует сначала как разделитель команд, а затем как разделитель команд , поэтому ваша командная строка становится эквивалентной двум отдельным командам:

$ java.exe -classpath .
$ $DIR hello

[Предостережение: у меня здесь нет окна Windows;следующее не проверено]

Вам нужно заключить в кавычки точку с запятой И (поскольку вы ввели параметр, представляющий список путей в собственном формате Win32, поэтому он будет освобожден от перевода, вам необходимо убедиться, чтоDIR ТАКЖЕ определяется как DIR=d:/myClasses НЕ как DIR=/d/myClasses):

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

ИЛИ, вам необходимо указать список путей полностью в формате UNIX (т.е. * 1035)* с двоеточием, а не точкой с запятой в качестве отдельного разделителя пути ):

$ java.exe -classpath .:$DIR hello 
...