2016-08-18 11 views
1

を使用してインストールを取得するために、私はJNLPの例をmy.jar起動するJNLPを使用していますことは可能です怒鳴るです:は、それはブラウザがJNLP

<?xml version="1.0" encoding="utf-8"?> 
<jnlp spec="1.0+" 
     codebase="https://***" 
     href="my.jnlp"> 
    <information> 
     <title>***</title> 
     <offline-allowed/> 
    </information> 
    <resources> 
    <jar href="lib/my.jar"/> 
    <j2se version="1.8+" 
     href="http://java.sun.com/products/autodl/j2se"/> 
    </resources> 
    <security> 
     <all-permissions/> 
    </security> 
    <application-desc main-class="my.gui.***"> 
    <argument>-browser.cmd=firefox</argument> 
    </application-desc> 
</jnlp> 

あなたは私が変数browser.cmd設定見ることができるように:

<argument>-browser.cmd=firefox</argument> 

ブラウザでHTMLコンテンツを開くためにmy.jarで使用されています。しかし残念ながら、それはいくつかのケースでは機能しません。

browser.cmdは=の値を返しました:

は、だから私は、これらの値は、次のように使用されるシステムにインストールされているブラウザのリストを返しますJNLPに関数を記述することは可能だと思います。

JNLP手段で実装することは可能ですか?

+0

このデータはどのように使用しますか?あなたのJavaアプリケーションからコマンドラインを使用してプロセスを開始しますか? – AlexR

+0

こんにちはアレックス、 それは後で使用されますが、私はこの質問を提起した理由であるJavaアプリ(独自のソフトウェア)を変更することはできません。 – FilippSmirnov

答えて

0

JNLP記述子にコードを追加することはできません。それは純粋な宣言です。

私はいくつかの解決策をお勧めします。様々な理由のための外部プロセスとして特定のブラウザを実行するために、悪いスタイルだと考えている

if(Desktop.isDesktopSupported()){ 
     Desktop desktop = Desktop.getDesktop(); 
     try { 
      desktop.browse(new URI(url)); 
     } catch (IOException | URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

あなたが特定のブラウザを開くには、このを使用している場合

は、最善の解決策は、APIを使用することです。

ただし、私が理解する限り、アプリケーションを変更することはできません。

第2の解決策は以下の通りです。あなた自身の "ブラウザ発見者"を実装することができます。この発見者をJNLPを使用して実行し、ブラウザを見つけて、JNLP経由で、またはより良い方法でブラウザをパラメータとして渡すことで、あなたの「本当の」アプリケーションを実行します。

このソリューションは、「適切な」ブラウザを検出できる場合に機能します。しかし、このようなタスクは、どのようなクロスプラットフォームの方法でも実装することはできません。たとえば、Windowsではレジストリをチェックすることができます.Linuxではフレーバーなどに依存します。

その他、奇妙なことがありますが、最も良い解決策は次のとおりです。 AOPを使用してRuntime.exec()メソッドをラップすることができます。ここでは、ブラウザの代わりに既存のパラメータではなく、非常に特別なものを渡します。「my-default-browser」としましょう。この文字列をアスペクトに発見して、コマンドがこの特別な値に等しい場合を除き、通常のexec()を呼び出すことができます。しかし、あなたの特別なケースでは、desktop.browse(new URI(url));を呼び出すことができます(私の答えの最初を見てください)。

この解決策はおそらく複雑に思えますが、実際はそうではありません。これを行うAspectJを使用して、5行の長いアスペクトを実装することができます。このソリューションは、手動で新しいプロセスを作成し、コードを変更できないようにしてブラウザを実行した誰かが犯した「犯罪」を解決します。このソリューションは移植性があり、どのプラットフォームでも動作し、システムにインストールされているブラウザーと現在のユーザーがそれらを実行できるかどうかには依存しません。