どちらの場合も、これら 2 つの問題を回避するために、起動時に実行される簡単なコードをアプリケーションに追加する必要があります。
プロパティ値で許可されていないワイルドカード
JNLP仕様には次のように書かれています:
JNLP クライアントは、セキュリティを維持するために、特定の jnlp 要素と引数値 (「java-vm-args」またはプロパティ「name」と「value」など) をブラックリストに登録 (または制限) することが期待されます。正確なリストは、個々の JNLP クライアントの実装次第です。
実際、Oracle の実装 (少なくとも 7u45 では) はvalue
、要素の属性をブラックリストに登録します<property/>
。ワイルドカードを使用することはできません。この決定の背後にある理由を見つけることはできませんでしたが、それはあります。
Webstart の回避策では、任意のプロパティ名と値を使用できます。アプレットの回避策では、コード署名時にプロパティの名前がわかっている必要があります。
回避策: Webstart
JNLP ファイルに、いくつかのワイルドカード引数を含めます。
<application-desc main-class="com.example.YourMainClass">
<argument>*</argument>
<argument>*</argument>
</application-desc>
アプリケーションのmain
メソッドで、これらの引数を解析し、 を使用してシステム プロパティにコピーしSystem.setProperty()
、リテラル値を持つ引数をスキップします"*"
。の最初の出現時に各引数を単純に分割することをお勧めします"="
。(アプリケーションがすでに通常の引数も取っている場合は、もう少し工夫する必要があります。)
回避策: アプレット
JNLP ファイルに、設定が必要なシステム プロパティを定義するパラメータを含めます。
<applet-desc main-class="com.example.YourMainClassApplet">
<param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
<param name="prop1" value="*"/>
<param name="prop2" value="*"/>
</applet-desc>
Applet.init()
メソッドで、パラメーターの値をSYS_PROPERTY_PARAMETERS
取得し、それを反復処理して各パラメーターの値を取得します。リテラルでない場合は、"*"
を使用してシステム プロパティにコピーしますSystem.setProperty()
。
[安全でない操作] ダイアログ
これは、LiveConnect (Java <-> JavaScript 相互作用) の使用によって引き起こされるOracle プラグインのバグです。
回避策: 「安全な」プロパティ プレフィックス
<property/>
JNLP の要素を介して設定されたすべてのシステム プロパティの前に を付け"jnlp."
ます。
<property name="jnlp.my-prop" value="fixed-value"/>
次に、アプリケーションのmain()
またはApplet.init()
メソッドで、 のコピーを System.getProperties()
反復処理し、プロパティ名が で始まる場合は、"jnlp."
その値を同じ名前のプロパティにコピーし、そのプレフィックスを削除します。(を回避するには、コピーを反復処理する必要がありConcurrentModificationException
ます。)
注意: JNLP テンプレート バリデーターは XML 属性の順序を考慮する
最後に、プロパティの値を入力するプロセスによって JNLP ドキュメント内の他の要素の属性が並べ替えられる可能性がある場合、JNLP テンプレートの検証が失敗する可能性があります。(DOM パーサーで JNLP を解析し、ワイルドカードを入力し、それをストリーミングして戻すことStreamResult
が、これが発生する 1 つの方法です。) たとえば、次の 2 つの複数属性要素があり、要素の順序が一致する必要がありました。
<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>