从 jar 文件执行时 JRuby 文件不是 运行(是:System.out.println 不从 jar 文件运行)
JRuby file not run when executing from jar file (was: System.out.println not working from jar file)
(在 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]
Java中的主程序,通过RedBridge Core调用JRuby代码。 Java
类 在 Jar 文件中。
这个设置有效,只要我不坚持 Ruby 代码也是
从 Jar 文件中执行,而不是在
文件系统。如果我 运行 来自 Jar 文件的代码,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");
也就是说,我将 RELATIVE 替换为 CLASSPATH,并删除了 "rbsrc/"。当我
运行 这个,我没有得到任何错误信息,我得到了所有 println 的输出
语句,但我没有看到 'puts' 语句的输出,也没有
文件 out.txt 已创建!
请注意 bridge.rb 似乎加载正确(如果我更改 bridge.rb
换个名字,我得到一个例外),但它似乎不是
已执行。
怎么会?
更新:我的问题描述有误! stdout没有问题,但是好像我的JRuby代码bridge.rb
没有执行! runScriptlet
returns null
, 当我在 Ruby 程序中创建文件时,之后没有文件。
我做错了什么?我的所有 JRuby 文件都在一个目录中。我将它们放入我的 Jar 文件中。我 运行 它使用 jar -cp JARFILE MAINCLASS
。还缺少什么?
顺便说一句,整个示例应用程序可以在 here 中找到。有一个 readme.txt
包括在内。
你说
I replace RELATIVE by CLASSPATH
您可能更改了 java 应该从 CLASSPATH 的相对路径搜索 classes 的设置。
您可能没有为您的 jar 文件设置正确的 CLASSPATH 变量值 - 这意味着 java
应该检查额外 classes (more) 的地方。
尝试
set classpath = .;yourFilename.jar;
注意点 (.) 代表当前目录。
然后您可以尝试在命令提示符中使用 -jar 参数来执行它:
java -jar yourFilename.jar
如果您的 jar 中没有清单,请尝试使用 -cp(或 -classpath,这是相同的)参数执行它以隐式指定您的 class 路径。
java -cp foo.jar full.package.name.MyClassName
现在,作为第二个想法,我会检查执行目录是否具有执行 jar 和文件创建(写入)的权限,以防万一。
更新:根据您的描述,问题最终不在 class 路径中 - 因为您没有任何例外,但在您为文件设置的路径中。
我建议您检查您为应用程序中的文件设置的相对路径,该路径具有正确的引用(仅文件名是不够的,因为 "rbsrc/bridge.rb" 是应用程序文件夹中的相对路径即使将选项从 RELATIVE 更改为 CLASSPATH,也应该保留这一点)。在这种情况下,相对路径基于作为根目录的应用程序文件夹。
(在 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]
Java中的主程序,通过RedBridge Core调用JRuby代码。 Java 类 在 Jar 文件中。
这个设置有效,只要我不坚持 Ruby 代码也是 从 Jar 文件中执行,而不是在 文件系统。如果我 运行 来自 Jar 文件的代码,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");
也就是说,我将 RELATIVE 替换为 CLASSPATH,并删除了 "rbsrc/"。当我 运行 这个,我没有得到任何错误信息,我得到了所有 println 的输出 语句,但我没有看到 'puts' 语句的输出,也没有 文件 out.txt 已创建!
请注意 bridge.rb 似乎加载正确(如果我更改 bridge.rb 换个名字,我得到一个例外),但它似乎不是 已执行。
怎么会?
更新:我的问题描述有误! stdout没有问题,但是好像我的JRuby代码bridge.rb
没有执行! runScriptlet
returns null
, 当我在 Ruby 程序中创建文件时,之后没有文件。
我做错了什么?我的所有 JRuby 文件都在一个目录中。我将它们放入我的 Jar 文件中。我 运行 它使用 jar -cp JARFILE MAINCLASS
。还缺少什么?
顺便说一句,整个示例应用程序可以在 here 中找到。有一个 readme.txt
包括在内。
你说
I replace RELATIVE by CLASSPATH
您可能更改了 java 应该从 CLASSPATH 的相对路径搜索 classes 的设置。
您可能没有为您的 jar 文件设置正确的 CLASSPATH 变量值 - 这意味着 java
应该检查额外 classes (more) 的地方。
尝试
set classpath = .;yourFilename.jar;
注意点 (.) 代表当前目录。
然后您可以尝试在命令提示符中使用 -jar 参数来执行它:
java -jar yourFilename.jar
如果您的 jar 中没有清单,请尝试使用 -cp(或 -classpath,这是相同的)参数执行它以隐式指定您的 class 路径。
java -cp foo.jar full.package.name.MyClassName
现在,作为第二个想法,我会检查执行目录是否具有执行 jar 和文件创建(写入)的权限,以防万一。
更新:根据您的描述,问题最终不在 class 路径中 - 因为您没有任何例外,但在您为文件设置的路径中。
我建议您检查您为应用程序中的文件设置的相对路径,该路径具有正确的引用(仅文件名是不够的,因为 "rbsrc/bridge.rb" 是应用程序文件夹中的相对路径即使将选项从 RELATIVE 更改为 CLASSPATH,也应该保留这一点)。在这种情况下,相对路径基于作为根目录的应用程序文件夹。