4

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

奇怪的是,NetBeans 报告了 0 个实时错误,它们仅在执行完整的清理和构建时才出现。这在我导入 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
编译自“WrappedException.java”
公共类 sun.org.mozilla.javascript.internal.WrappedException 扩展 sun.or
g.mozilla.javascript.internal.EvaluatorException{
    静态最终长序列版本UID;
    公共 sun.org.mozilla.javascript.internal.WrappedException(java.lang.Throwa
贝尔);
    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);
    }
}

网豆输出:

在里面:
部门清理:
更新属性文件:C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\built-clean.properties
删除目录 C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build
干净的:
在里面:
deps-jar:
创建目录:C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build
更新属性文件:C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\built-jar.properties
创建目录:C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\classes
创建目录:C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\empty
将 1 个源文件编译到 C:\Documents and Settings\LordQuackstar\Desktop\TestApp\build\classes
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:8: 包 sun.org.mozilla.javascript.internal 不存在
导入 sun.org.mozilla.javascript.internal.WrappedException;
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:16:找不到符号
符号:类 WrappedException
位置:类 testapp.Main
                WrappedException e = new WrappedException(null);
                ^
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp\Main.java:16:找不到符号
符号:类 WrappedException
位置:类 testapp.Main
                WrappedException e = new WrappedException(null);
                                         ^
3 个错误
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\nbproject\build-impl.xml:528:执行此行时出现以下错误:
C:\Documents and Settings\LordQuackstar\Desktop\TestApp\nbproject\build-impl.xml:261:编译失败;有关详细信息,请参阅编译器错误输出。
构建失败(总时间:0 秒)

命令行输出:

C:\Documents and Settings\LordQuackstar\Desktop\TestApp\src\testapp>javac Main.java
Main.java:3: 包 sun.org.mozilla.javascript.internal 不存在
导入 sun.org.mozilla.javascript.internal.WrappedException;
                                          ^
Main.java:7:找不到符号
符号:类 WrappedException
位置:类 testapp.Main
        WrappedException e = new WrappedException(null);
        ^
Main.java:7:找不到符号
符号:类 WrappedException
位置:类 testapp.Main
        WrappedException e = new WrappedException(null);
                                 ^
3 个错误

那么,什么会导致它突然失败呢?它昨天工作得很好。除了从同一个包中再导入 2 个类之外,我没有做任何更改。我的依赖项都没有改变。

将在linux中测试,看看问题是否仍然存在。

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

4

4 回答 4

6

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

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

于 2010-07-04T20:59:28.710 回答
4

我同意上述建议,您最好不要尝试使用 sun 内部包。

这就引出了一个问题,您如何在没有 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+"];");
}
于 2013-04-09T20:29:03.410 回答
1

我有同样的错误。您必须手动rt.jar从 JRE 目录添加到项目库。只有这个解决方案似乎有效。您还可以在此处查看Rob Di Marco关于此方法的教程

于 2012-05-27T18:06:11.273 回答
0

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

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

于 2012-03-16T14:22:14.033 回答