在我的 java 程序中,我大量使用 Suns 的 Rhino 脚本引擎实现。然而最近,我的 JDK 在编译时似乎不再自动导入 rt.jar 文件。

奇怪的是,NetBeans 报告 0 个实时错误,它们仅在执行完整的 Clean & Build 时才会出现。之前我导入 NativeArray 时没有发生过这种情况,所以我真的很困惑为什么它突然停止工作。

眼镜:

  • 操作系统-Windows
  • Java 版本 - java 版本“1.6.0_20”
  • Javac 版本 - javac 1.6.0_20
  • NetBeans 版本 - 6.9

检查它是否存在:

C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src>javap sun.org.mozill
a.javascript.internal.WrappedException
Compiled from "WrappedException.java"
public class sun.org.mozilla.javascript.internal.WrappedException extends sun.or
g.mozilla.javascript.internal.EvaluatorException{
    static final long serialVersionUID;
    public sun.org.mozilla.javascript.internal.WrappedException(java.lang.Throwa
ble);
    public java.lang.Throwable getWrappedException();
    public java.lang.Object unwrap();
}

好的,它存在,所以这里有一些测试代码:

package testapp;

import sun.org.mozilla.javascript.internal.WrappedException;

public class Main {
    public static void main(String[] args) {
        WrappedException e = new WrappedException(null);
    }
}

Netbeans 输出:

init:
deps-clean:
Updating property file: C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\built-clean.properties
Deleting directory C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build
clean:
init:
deps-jar:
Created dir: C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build
Updating property file: C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\built-jar.properties
Created dir: C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\classes
Created dir: C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\empty
Compiling 1 source file to C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\classes
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:8: package sun.org.mozilla.javascript.internal does not exist
import sun.org.mozilla.javascript.internal.WrappedException;
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:16: cannot find symbol
symbol  : class WrappedException
location: class testapp.Main
                WrappedException e = new WrappedException(null);
                ^
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:16: cannot find symbol
symbol  : class WrappedException
location: class testapp.Main
                WrappedException e = new WrappedException(null);
                                         ^
3 errors
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\nbproject\build-impl.xml:528: The following error occurred while executing this line:
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\nbproject\build-impl.xml:261: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 0 seconds)

命令行输出:

C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp>javac Main.java
Main.java:3: package sun.org.mozilla.javascript.internal does not exist
import sun.org.mozilla.javascript.internal.WrappedException;
                                          ^
Main.java:7: cannot find symbol
symbol  : class WrappedException
location: class testapp.Main
        WrappedException e = new WrappedException(null);
        ^
Main.java:7: cannot find symbol
symbol  : class WrappedException
location: class testapp.Main
        WrappedException e = new WrappedException(null);
                                 ^
3 errors

那么什么会导致这个突然失败呢?昨天还运行得很好。除了从同一个包中导入另外 2 个类之外,我没有做任何更改。我的依赖关系都没有改变。

将在linux下进行测试,看看问题是否仍然存在。

在你说之前:不,我不会单独下载 rhino,不,我不会更改 IDE,

有帮助吗?

解决方案

有两个迹象表明您不应该使用此类: suninternal - 这意味着这是一些第三方不应使用的内部类。因为它可以在未来的版本中更改或删除 - 即这不是 API 的一部分。所以 - 单独下载 Rhino。

如果您使用脚本 API - 仅使用 API 类/接口 - 即 javax.script

其他提示

我同意以上建议,最好不要尝试使用Sun Internal套餐。

这就提出了一个问题,您如何访问w/out out sun.org.mozilla.javascript.internal.nativearray的JavaScript阵列?

对我有用的是代码如下。这将在一个名为vars的JavaScript数组中创建一个称为VARS的Java数组。

int varsLength = ((Double)engine.eval("vars.length;")).intValue();
Object[] vars = new Object[varsLength];
for(int i=0; i<vars.length; i++){
    vars[i] = engine.eval("vars["+i+"];");
}

我有同样的错误。您必须手动添加 rt.jar 从JRE DIR到项目库。只有该解决方案似乎起作用。您还可以看到有关此方法的教程 这里 作者Rob Di Marco

现在,这是一个古老的问题,但是当我遇到这个问题时,我的解决方案是在JavaScript环境中进行更多工作,然后返回原始类型(字符串 /布尔)而不是对象。

当然,这将无法满足所有人和所有要求,但在某些情况下可能会有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top