2017-02-03 8 views
7

基本的には、JREがインストールされているJREに応じて、JavascriptをRhinoまたはNashornで使用するJavaプラグインスクリプトを実行します。JavaScript(Rhino/Nashorn)からJarファイルとクラスを追加して削除する

また、実行時に追加の.JARファイルをプラグインできるJava環境内のシステムもあります。

これはすべて上質でダンディーです。しかし、私は少し違うものが欲しいという状況に遭遇しました。クラスパスがから以内にある.JARファイルをRhino/Nashornエンジンインスタンスにロードしたいので、クラスはそのインスタンスだけで利用できます)、エンジンの実行が終了したら、を取り除いてください。

私はJavaScriptから.JARファイルのURLをロードするために既存のJavaルーチンを簡単に呼び出すことができますが、クラスは永続的にインストールされ、削除できません。

問題は基本的に、ユーザーが同じ.JARファイルの異なるバージョンの複数のプラグインを持つことができます(サードパーティによって提供され、複数の異なるプラグインにさまざまな方法で使用されます)。プラグインが必要です正しいものをロードしてから後で取り除くことができるようにする。

私の既存のURLローダーされています。今、私は実際にどのように動作するかの手掛かりの多くを持っていない

public static void addURL(URL u) { 
    final Class[] parameters = new Class[]{URL.class}; 
    URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    Class sysclass = URLClassLoader.class; 

    try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader, new Object[]{u}); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

- 私は、電力Javaプログラマ(私は主にC/C++を行う)ではありませんよ。私はあなたがURLClassLoaderからURLを「アンロード」できないことを知っていますので、私はそれを求めていません。何が最善でしょうか、私は、実行の最後に捨てる "一時的な" URLClassLoaderに.JARファイルを追加する方法があるかどうかです。または、何らかの方法で、クラスJavaのクラスパスではなく、スクリプトエンジンにクラスを直接ロードできます。

私はJavaScriptから直接呼び出すことができますが、それは素晴らしいですが、必要に応じてジョブを実行するJavaメソッドを実装したり、何らかの方法でスクリプトエンジンを拡張することもできます。

答えて

5

プラグイン固有のクラスを分離するには、別々の(カスタム)クラスローダインスタンスを作成し、それをJavaスクリプトエンジンに渡す必要があります。特定のクラスローダーによってロードされたクラスは、特定のJavaスクリプトエンジンにのみ表示されます。

ScriptEngineというコンテキストでクラスローダーを記述するthis answerが見つかりました。

これが正しい方向に進むのに役立ちます。

関連する問題