4

JAXP、具体的にはSAXParserFactoryを呼び出す必要のあるアプレットがあります。これで、Javadocからわかるように、これは、ここに記載されているサービスプロバイダーメカニズムを内部的に使用します。

具体的には、呼び出されたアプリケーションJARのいずれにもファイルが見つからない場合META-INF/services/javax.xml.parsers.SAXParserFactory、アプリケーションコードベースからファイルをフェッチしようとします。アプレットを次のように展開した場合:

<applet code="com.example.applets.MyApplet" 
 codebase="http://www.example.com/myapp/" archive="myapp.jar, dom4j.jar">

次に、 http://www.example.com/myapp/META-INF/services/javax.xml.parsers.SAXParserFactoryにHTTPリクエストを送信しようとします。

特に、アプレットが署名されていて、この追加のHTTP呼び出しが署名されていないコードに関する警告をトリガーするため、そうしないほうがいいです。

さて、明らかな解決策は、META-INF / servicesファイルをアプリケーションJARに配置することですが、それでもユーザーのJREのデフォルトのJAXP実装を使用するにはどうすればよいですか?または、アプレットランタイムを説得して、JARファイルのみcodebaseを検索し、そのファイルを検索しないようにする方法はありますか?

注:JAXP-RIの独自のコピーをデプロイすることもできることは知っていますが、それはアプレットとしてはかなり重いものです。

4

1 に答える 1

11

コードベースルックアップを無効にします。

<applet ...>
 <param name="codebase_lookup" value="false">
</applet>

上記のパラメータを設定することで影響を受ける可能性のあるブールプロパティのAppletClassLoaderチェック。sun.applet.AppletClassLoader.codebaseLookupメソッドsun.applet.AppletPanel.init()はパラメータを読み取り、それをに設定しますAppletClassLoader。無効にすると、AppletClassLoaderは、コードベース内のクラスとリソースのリモートルックアップの実行を停止します。これは、によって指定されたURLでありcodebase="http://www.example.com/myapp/"、アーカイブとシステムクラスパスのみを調べます。

注:私はこれを自分でテストしませんでしたが、分解されたコードのコードレビューによると、正直に言ってそれが機能すると信じています。

また、JavaSE-テクニカルノート-プラグイン開発者ガイド-特別な属性にも記載されています。

codebase_lookup

アプレットクラスローダーがクラスまたはリソース(たとえば、META-INF / servicesディレクトリの下にあるプラグ可能なサービスプロバイダーの構成ファイル)をロードする必要がある場合、最初にアプレットJARファイルで必要なファイルを検索し、次にアプレットコードベースから検索します。通常、アプレットは、アプレットJARファイルに格納されている必要なすべてのクラスとリソースを使用してデプロイされます。この場合、コードベースのルックアップは不要です。

クラスまたはリソースがアプレットJARファイルから利用できない場合は、コードベースのルックアップを試みるよりも、クラスローダーを失敗させる方がよい場合があります。そうしないと、クラスまたはリソースを検索するためにアプレットコードベースに接続する必要があり、アプレットのランタイムにパフォーマンスの影響を与える可能性があります。

于 2010-11-17T20:59:09.157 に答える