(交叉张贴在JRuby 论坛,但因为我还没有得到任何答案而再次发布在这里)。
平台:jruby 9.0.4.0 (2.2.2) 2015-11-12 b9fb7aa Java HotSpot(TM) 64-Bit Server VM 24.79-b02 on 1.7.0_79-b15 +jit [Windows 7-amd64]
Java中的主程序,通过RedBridge Core调用JRuby代码。Java 类位于 Jar 文件中。
只要我不坚持 Ruby 代码也从 Jar-File 中执行,而不是在文件系统中搜索,这种设置就可以工作。如果我从 Jar 文件运行代码,JRuby 标准输出似乎已经消失了。
首先,这是工作案例:
// 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 文件。
现在对于非工作案例:
在整个设置中,我只更改了一行: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 文件放在一个目录中。我将它们放入我的 Jar 文件中。我使用jar -cp JARFILE MAINCLASS
. 还缺少什么?
顺便说一句,整个示例应用程序可以在这里找到。有一个readme.txt
包含。