2

Windows で mingw git bash シェルから jruby を実行する際に問題が発生しています。jruby 1.6.2 の Windows インストーラーをダウンロードし、問題なく実行しました。新しい Windows コマンド シェルを開くと、正常に動作するようです。レーキとシナトラの宝石をインストールしました。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 シェルを開いて 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 を呼び出すことだと思います。

問題は、msys がほとんどの場合に POSIX を Win パスに変換できる一方で、スクリプトがクラスパスやその他の情報を jar に渡すために独自に文字列を作成することです。

これが物事がめちゃくちゃになっているところのようです。スクリプトには、これと同じ理由で cygwin を扱うコードのブランチがあります。スクリプトが cygwin で実行されていると思わせるように強制しようとしましたが、残念ながら、スクリプトは「cygpath」プログラムを使用してパスを取得しており、msys では使用できません。

4

2 に答える 2

3

実際、これは bash スクリプトの「欠けている機能」であることが判明しました。jruby jira にバグを提出し、解決しました

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

この記事の執筆時点では、コミットは jruby Web サイトでダウンロードできるビルドの一部ではないことに注意してください。しかし、修正は非常に簡単でした。

ここにコミットがあります: https://github.com/jruby/jruby/commit/8766f84b774ae5ae68204931bd4eab61b81a2056

jruby.bash ファイルの先頭にある uname ケースに以下を追加するだけです。

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

トリックは、mingw シェルが Windows 環境からすべての環境変数を継承しない可能性があることです。jruby ディレクトリ内で動作する
場合は、次のようになります。java -jar lib/jruby.jar -e "puts 'hello

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

同様に動作するはずです。
そうでない場合は、2 つの環境変数のセットを慎重に比較します (通常の DOS シェルでは機能し、mingw シェルでは機能しません)。


このスレッドに示されているように、mingw 環境でのクラスパスの構文の違いと同じくらい単純な場合もあります。

あなたの問題は、パスが正しく渡されていないことではありません。それはあなたがそれをまったく通過させなかったということです。
入力したとおり、コマンド ラインには引用符で囲まれていないセミコロンが含まれています。bash などの Bourne 互換シェルでは、引用符で囲まれていないセミコロンが最初にコマンド ターミネータとして機能し、次にコマンド セパレータとして機能するため、コマンド ラインは 2 つの個別のコマンドと同等になります。

$ java.exe -classpath .
$ $DIR hello

[注意: ここには Windows ボックスはありません。以下はテストされていません]

セミコロン AND を引用する必要があります (Win32 ネイティブ形式のパス リストを表すパラメーターを導入したため、翻訳から除外されるため、もNOT としてDIR定義されていることを確認する必要があります):DIR=d:/myClassesDIR=/d/myClasses

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

または、パス リスト全体を UNIX 形式で指定する必要があります (つまり、個々のパス セパレータとしてセミコロンではなくコロンを使用します)。

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