解析 JRuby 中的 Ruby 表达式时出现异常

Exception when parsing a Ruby expression in JRuby

我创建了一个包含 ruby 文件内容的字符串,但是当我尝试使用 JRubyEngine scriptEngine 解析它时,我在解析表达式期间遇到了 NegativeArraySizeException。

我在 JRuby 引擎的 yacc 解析过程中知道它,但我没有更多信息。我执行的代码是:

rubyEngine = (JRubyEngine) manager.getEngineByName("jruby");
RubyClass klass = (RubyClass) rubyEngine.eval(scriptContent);

最后一行出现异常。 rb 脚本是:

class myRubyObject
require org.scripthelper.ruby.samples.Script
  def execute() {
    10
  }
end

脚本 class 是一个 java class,它只有以下方法:

public int execute();

我希望得到一个 RubyClass,但我在解析过程中得到了这个 NegativeArraySizeException。

这是异常的堆栈跟踪:

    at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:104)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:142)
...
Caused by: org.jruby.embed.ParseFailedException: java.lang.NegativeArraySizeException
    at org.jruby.embed.internal.EmbedRubyRuntimeAdapterImpl.runParser(EmbedRubyRuntimeAdapterImpl.java:207)
    at org.jruby.embed.internal.EmbedRubyRuntimeAdapterImpl.parse(EmbedRubyRuntimeAdapterImpl.java:94)
    at org.jruby.embed.ScriptingContainer.parse(ScriptingContainer.java:1227)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:89)
    ... 31 more
Caused by: java.lang.NegativeArraySizeException
    at org.jruby.lexer.yacc.SyntaxException.prepareMessage(SyntaxException.java:111)
    at org.jruby.lexer.yacc.SyntaxException.<init>(SyntaxException.java:96)
    at org.jruby.lexer.yacc.RubyLexer.compile_error(RubyLexer.java:390)
    at org.jruby.parser.ParserSupport.yyerror(ParserSupport.java:1200)
    at org.jruby.parser.RubyParser6.execute(RubyParser.java:2541)
    at org.jruby.parser.RubyParser.yyparse(RubyParser.java:1698)
    at org.jruby.parser.RubyParser.yyparse(RubyParser.java:1589)
    at org.jruby.parser.RubyParser.parse(RubyParser.java:5744)
    at org.jruby.parser.Parser.parse(Parser.java:133)
    at org.jruby.parser.Parser.parse(Parser.java:87)
    at org.jruby.Ruby.parseEval(Ruby.java:2729)

scriptContent 必须有一些与 NegativeArraySizeException 相关的错误

检查脚本,或者使用另一个脚本失败证明进行测试,例如

> rubyEngine = (JRubyEngine) manager.getEngineByName("jruby"); RubyClass
> rubyEngine.eval("puts('hello world')");

现在我又可以post回答了。正确的脚本是:

require 'java'
class MyRubyObject
java_implements org.scripthelper.ruby.samples.Script
  def execute()
    return 10
  end
end

我之前犯的错误是:

  • def 方法不应包含在 {} 中
  • 内容前的要求'java'应该很重要
  • 我没有正确定义 org.scripthelper.ruby.samples.Script class 是由 Ruby class
  • 实现的
  • 此外 Ruby class 的名称首字母必须大写

Java 代码正确:

ScriptEngineManager manager = new ScriptEngineManager();
JRubyEngine rubyEngine = (JRubyEngine) manager.getEngineByName("jruby");
rubyEngine.eval(scriptContent);

RubyObject object = (RubyObject) rubyEngine.eval(className + ".new");
Script s = object.toJava(Script.class);