4

私のJavaプログラムでは、RhinoスクリプトエンジンのSuns実装を多用しています。しかしごく最近、私のJDKはコンパイル時にrt.jarファイルを自動的にインポートしなくなったようです。

奇妙なことに、NetBeansは0のライブエラーを報告し、完全なクリーン&ビルドを実行した場合にのみ表示されます。これは、NativeArrayをインポートする前は発生していなかったので、なぜ突然機能しなくなったのか、本当に混乱しています。

仕様:

  • OS-Windows
  • Javaバージョン-Javaバージョン"1.6.0_20"
  • javacバージョン-javac1.6.0_20
  • NetBeansバージョン-6.9

それが存在するかどうかを確認します。

C:\ Documents and Settings \ LordQuackstar \ Desktop \ TestApp \ src> javap sun.org.mozill
a.javascript.internal.WrappedException
「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の出力:

初期化:
deps-clean:
プロパティファイルの更新: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

このクラスを使用してはならないという2つの兆候があります。sunこれらinternalは、これがサードパーティによって使用されるべきではない内部クラスであることを意味します。将来のリリースで変更または削除される可能性があるため、つまり、これはAPIの一部ではありません。つまり、Rhinoを個別にダウンロードしてください。

スクリプトAPIを使用している場合-APIクラス/インターフェースのみを使用してください-すなわちjavax.script

于 2010-07-04T20:59:28.710 に答える
4

私は、あなたが太陽の内部パッケージを使おうとしないほうがよいという上記のアドバイスに同意します。

これは疑問を投げかけます、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.jarJREディレクトリからプロジェクトライブラリに手動で追加する必要があります。この解決策だけがうまくいくようです。RobDiMarcoによるこのアプローチのチュートリアルもここで見ることができます

于 2012-05-27T18:06:11.273 に答える
0

これは今では古い質問ですが、この問題が発生したときの解決策は、JavaScript環境でより多くの作業を行い、オブジェクトではなくプリミティブ型(String / Boolean)を返すことでした。

もちろん、これですべての要件を満たすことはできませんが、場合によっては役立つことがあります。

于 2012-03-16T14:22:14.033 に答える