2012-01-12 5 views
2

シナリオ:"java.library.path"のJVMリロードを強制するのは悪い考えですか?

私は.dllファイルを使用する必要がありますアプレットを持っています。 .dllはPATHに存在しなければなりません。 PATH上で.dllを取得するには、アプレットを使用して、ブラウザを実行しているユーザーが管理者権限を持っていなければなりません(通常、右クリックアイコン管理者として実行...)。

問題:

私は行政privelagesを獲得することの必要性を取り除くしたいと思います。

悪い考え方 私はアプレットにユーザーのホームディレクトリのどこかにファイルを保存させたいと思っています。そのパスをPATHに追加したいと思います。それがこれを行うには、JVMを強制的に悪い考え

System.setProperty("java.library.path", <new path>); 

    try { 
     // this forces JVM to reload "java.library.path" property 
     Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
     fieldSysPath.setAccessible(true); 
     fieldSysPath.set(null, null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     init_failure = true; 
    } 

質問

です:Appearently、それを介して行うことができますか?これは文書化されていないメソッドを使用していますか?それは単なるハックですか?

他のビット

これはアプレットですので、私は正しい、-Dオプションを使ってjava.library.pathに指定することはできませんか?

このコードはイントラネットにあります。普通のインターネットタフな男のためのものではありません。

+4

私たちは皆「管理者特権を取得する必要性を取り除く」のが好きではないでしょうか... – maerics

+0

はい、このようにするのは悪い考えです。これは、使用されている 'ClassLoader'の実装の詳細に依存しています。これは、将来のバージョンのJRE、または他のベンダーのJRE実装では機能しない可能性があります。使用されている特定の 'ClassLoader'実装に' sys_paths'という名前のフィールドがあるという保証はありません。 – Jesper

+0

解決策は醜いですが、おそらく最も醜い解決策です。 ;) –

答えて

3

field.setAccessible(true)は常にハッキーであり、文書化されていません。それはプライベートフィールドを変更します!多分あなたは運が良ければ、サポートされているすべてのJVMで動作し、いつでも変更されることはありません。

パスを変更する前に何らかの理由でJVMが以前のjava.library.pathにdllのバージョンを見つけてロードした場合に何が起こるか心配です。私はそれがロードされたバージョンを維持し、新しいものをロードしないだろうと思う。

制御された環境で作業する場合は、これらの問題を無視する可能性がありますが、別の解決策を見つけることをおすすめします。例えば。簡単なインストーラーでdllをリモートインストールするようにユーザーに指示します。

関連する問題