从jar文件执行时不运行JRuby文件(是:System.out.println无法从jar文件中运行)

时间:2015-11-30 10:37:09

标签: java jruby jruby-java-interop

(在JRuby Forum上发布,但由于我还没有得到任何答复,因此再次发布在此处。)

平台:jruby 9.0.4.0(2.2.2)2015-11-12 b9fb7aa Java HotSpot(TM)64位服务器 VM 24.79-b02于1.7.0_79-b15 + jit [Windows 7-amd64]

Java中的主程序,通过RedBridge Core调用JRuby代码。 Java的 类在Jar文件中。

这个设置有效,只要我不坚持Ruby代码也是如此 从Jar-File中执行,而不是在内部搜索 文件系统。如果我从Jar-File运行代码,JRuby stdout似乎已经消失了。

首先,这是工作案例:

// 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");

也就是说,我用CLASSPATH替换RELATIVE,然后删除“rbsrc /”。当我 运行这个,我没有收到任何错误信息,我得到了所有println的输出 语句,但我没有看到'puts'语句的输出,也没有 文件out.txt已创建!

请注意,bridge.rb似乎正确加载(如果我更改bridge.rb 以不同的名字,我得到一个例外),但它似乎不是 执行。

怎么回事?

更新:我的问题说明错了! stdout没有任何问题,但似乎我的JRuby代码bridge.rb没有被执行! runScriptlet返回null,当我在Ruby程序中创建文件时,之后没有文件。

我做错了什么?我将所有JRuby文件放在一个目录中。我将它们放入我的Jar文件中。我使用jar -cp JARFILE MAINCLASS运行它。还缺少什么?

BTW,可以找到整个示例应用程序here。包含readme.txt

1 个答案:

答案 0 :(得分:0)

你说

  

我用CLASSPATH替换RELATIVE

您可能更改了java应该从CLASSPATH的相对路径搜索类的设置。

您可能没有为jar文件设置正确的CLASSPATH变量值 - 这意味着java应检查其他类(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,也应保留此项。在这种情况下,相对路径基于作为root的应用程序文件夹。