0

( JRuby Forumでクロスポストされましたが、まだ回答が得られなかったため、ここに再度投稿しました)。

プラットフォーム: jruby 9.0.4.0 (2.2.2) 2015-11-12 b9fb7aa Java HotSpot(TM) 64 ビット サーバー VM 24.79-b02 on 1.7.0_79-b15 +jit [Windows 7-amd64]

RedBridge Core を介して JRuby コードを呼び出す Java のメイン プログラム。Java クラスは Jar-File にあります。

Ruby コードがファイル システム内で検索されるのではなく、Jar ファイル内からも実行されると主張しない限り、このセットアップは機能します。Jar ファイルからコードを実行すると、JRuby の stdout が消えてしまったようです。

まず、これがWORKINGケースです:

// My main program (Jmain.java):
import vp.VP;
public class Jmain {
  public static void main(String[] args){
    System.out.println("Jmain started");
    VP vp = new vp.VP();
    System.out.println("vp instance created");
    vp.run();
    System.out.println("Jmain terminating");
  }
}

// My VP class (VP.java):
package vp;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.RubyObject; 
import org.jruby.embed.ScriptingContainer;
import org.jruby.embed.LocalContextScope;
import java.util.*;
public class VP {
  private ScriptingContainer container;
  public VP() {
    container = new ScriptingContainer(LocalContextScope.SINGLETHREAD);
  }
  public void run() {
    RubyObject asahi =
        (RubyObject)container.runScriptlet( 
            org.jruby.embed.PathType.RELATIVE,"rbsrc/bridge.rb");
    System.out.println("scriptlet executed");
  }
}

# My Ruby program rbsrc/bridge.rb
puts "Entering bridge" # Just to see what's going on
File.write("out.txt","This file was created by bridge.rb\n")
# ... rest of the code not shown

:: I put everything into a jar file, including the Ruby files
:: (although I don't need them there yet).
jar cvfm jars\vp.jar .... rbsrc

:: The program is executed like this:
java -cp c:\jruby-9.0.4.0\lib\jruby.jar;jars\vp.jar Jmain

すべての println ステートメントの結果が表示され、ファイル out.txt が作成されます。

次に、NON-WORKING ケースの場合:

全体の設定で、1 行だけ変更します。bridge.rb の呼び出しは次のようになります。

RubyObject asahi = 
    (RubyObject)container.runScriptlet(
         org.jruby.embed.PathType.CLASSPATH,"bridge.rb");

つまり、RELATIVE を CLASSPATH に置き換え、「rbsrc/」を削除します。これを実行すると、エラー メッセージは表示されず、すべての println ステートメントの出力が得られますが、「puts」ステートメントの出力は表示されず、ファイル out.txt も作成されません。

bridge.rb は正しく読み込まれているように見えますが (bridge.rb を別の名前に変更すると例外が発生します)、実行されていないようです。

どうして?

更新: 問題の説明が間違っていました! stdout に問題はありませんが、JRuby コードbridge.rbが実行されていないようです。runScriptletを返しnull、Rubyプログラム内でファイルを作成すると、その後ファイルがありません。

私は何を間違っていますか?すべての JRuby ファイルを 1 つのディレクトリに格納しています。それらをJarファイルに入れました。を使用して実行しjar -cp JARFILE MAINCLASSます。他に何が欠けていますか?

ところで、サンプル アプリケーション全体はここにあります。込みがありreadme.txtます。

4

1 に答える 1

0

あなたが言った

RELATIVE を CLASSPATH に置き換えます

おそらく、Java がクラスを検索する場所の設定を相対パスから CLASSPATH に変更した可能性があります。

javaおそらく、jar ファイルに正しい CLASSPATH 変数値を設定していない可能性があります。これは、余分なクラス ( more ) をチェックする場所を意味します。

試す

set classpath = .;yourFilename.jar;

ドット (.) は現在のディレクトリを表すことに注意してください。

その後、コマンド プロンプトで -jar パラメータを使用して実行を試みることができます。

java -jar yourFilename.jar

jar にマニフェストがない場合は、-cp (または同じ -classpath) パラメーターを使用してマニフェストを実行し、クラスパスを暗黙的に指定してみてください。

java -cp foo.jar full.package.name.MyClassName

ここで、念のため、実行中のディレクトリに jar の実行とファイルの作成 (書き込み) のアクセス許可があることを確認します。

更新:あなたが説明したことから、問題は最終的にクラスパスではなく、例外がないため、ファイルに設定したパスにあるようです。

正しい参照を持つアプリケーション内のファイルに設定した相対パスを確認することをお勧めします (「rbsrc/bridge.rb」はアプリケーション フォルダー内の相対パスであり、これは必要があるため、ファイル名だけでは十分ではありません)。オプションを RELATIVE から CLASSPATH に変更しても保持されます)。その場合の相対パスは、ルートとしてのアプリケーション フォルダーに基づいています。

于 2015-12-08T13:00:45.380 に答える