用实际文件名替换Java Rhino(JSR223)中的<Unknown Source>

The*_*eLQ 8 java rhino jsr223

在我的代码中,所有脚本都包含在.js文件中.每当其中一个脚本包含错误时,我就会得到:

javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:未定义"nonexistant".(<未知来源>#5)在第5行的<未知来源>中

我不知道的是<Unknown Source>.多个文件在一个ScriptContext中,并且很难找到错误.它看起来也很糟糕.

有没有办法用实际文件名替换<Unknown Source>?我看到的所有方法都没有支持传递File对象,所以我真的很困惑.

Kev*_*use 10

使用ScriptEngine.FILENAME常量:

scriptEngine.put(ScriptEngine.FILENAME,scriptFile.toString());


小智 6

这个问题还没有被特别提出,但我想我会向未来偶然发现这个话题的人提供这个:当Java 8发布时我们会从Rhino转移到Nashorn作为底层JavaScript引擎.在Nashorn下,文件名应用于ScriptContext,而不是ScriptEngine本身:

ScriptContext context = new SimpleScriptContext();
context.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
try
{
    engine.eval(script, context);
}
catch (ScriptException e)
{
    /* e.getFileName() will return "test.js" */
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用ScriptEngine.put()来应用文件名,就像在Rhino下一样,不会发生任何事情,您的异常将返回"<eval>"作为文件名.

我想在未来几个月会有一些人遇到这个问题,所以我想我会提供它.这似乎没有在任何地方记录.我不得不深入研究Nashorn的源代码来解决它.