【问题标题】:Working Rhino code with Java 1.7 and make Exeception with Java 1.8使用 Java 1.7 工作 Rhino 代码并使用 Java 1.8 生成异常
【发布时间】:2015-01-28 16:15:56
【问题描述】:

我的应用程序使用 Rhino 来混合 javascript 代码和 Java 对象。

在 JVM 1.5、1.6 和 1.7 上一切正常,但在运行时使用 JVM 1.8.0 时会生成错误的 ArrayIndexOutOfBoundsException:

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;

public class RhinoOn8 {

    static public void main(String[] args) throws SecurityException, NoSuchMethodException {        
        Context ctx = Context.enter();
        Scriptable scope = ctx.initStandardObjects();
        Object ev = ctx.evaluateString(scope, "'' + java.lang.System.getProperty(\"user.name\")", "exec", 0, null);
        System.out.println(ev);
        Context.exit();
    }
}

在 JVM Oracle 1.7.0_55 上运行良好,并在 JVM Oracle 1.8.0_31 上执行此操作:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5747
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.readClass(ClassReader.java:1572)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:341)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:300)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescriptor.<init>(ClassDescriptor.java:67)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescriptor.getInstance(ClassDescriptor.java:82)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.MethodDescriptor.getInstance(MethodDescriptor.java:120)
    at org.mozilla.javascript.net.sf.retrotranslator.runtime.java.lang.reflect._Method.isVarArgs(_Method.java:96)
    at org.mozilla.javascript.jdk15.VMBridge_jdk15.isVarArgs(VMBridge_jdk15.java:33)
    at org.mozilla.javascript.MemberBox.init(MemberBox.java:44)
    at org.mozilla.javascript.MemberBox.<init>(MemberBox.java:32)
    at org.mozilla.javascript.JavaMembers.reflect(JavaMembers.java:455)
    at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:43)
    at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:807)
    at org.mozilla.javascript.NativeJavaObject.initMembers(NativeJavaObject.java:54)
    at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:44)
    at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:34)
    at org.mozilla.javascript.WrapFactory.wrapAsJavaObject(WrapFactory.java:115)
    at org.mozilla.javascript.WrapFactory.wrap(WrapFactory.java:72)
    at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:236)
    at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
    at org.mozilla.javascript.gen.exec_1._c_script_0(exec:0)
    at org.mozilla.javascript.gen.exec_1.call(exec)
    at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
    at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
    at org.mozilla.javascript.gen.exec_1.call(exec)
    at org.mozilla.javascript.gen.exec_1.exec(exec)
    at org.mozilla.javascript.Context.evaluateString(Context.java:1079)
    at RhinoOn8.main(RhinoOn8.java:12)

我尝试使用 Rhino1.7R4 和 Rhino1.7R5pre 得到相同的结果。

有人知道解决方法(不更改 JS 源)?

【问题讨论】:

  • 不应该在JDK8中使用Nashorn吗?有使用 Rhino 的理由吗?
  • 这适用于应该在多个 java 版本上运行的 web 应用程序。
  • 我刚刚在 Windows 7 上使用 Rhino1.7R4 和 64 位 JDK 1.8.0_31 进行了尝试,并且成功了。
  • 我在使用 32 位 JVM 的 64 位 Linux 上。我会在其他操作系统上试试看。
  • Windows 8.1 64 和 1.8.0_31 32 位 JVM 上的相同错误。

标签: java java-8 rhino retrotranslator


【解决方案1】:

使用js.jar不是 JVM 1.4需要的js-14.jar

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2018-12-08
    • 2015-03-19
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多