ひよっこ。

I want to…

JavaWebStartからブラウザを起動する

Posted by hikaruworld : 2009 1月 22

ちょっと必要になったので調べた結果。

基本的にはBONNOH FRACTION 13のまんまです。

方法

いくつか探してみたが、以下の方法を見つけた。

  1. java.lang.Rntime.exec(String[])
  2. BareBonesBrowserLaunch
  3. javax.jnlp.BasicService
  4. java.awt.Desktop.browse(URI)

考慮点

今回は以下の点を考慮する

  • セッションの引継ぎ
  • 起動するブラウザ
  • 対応OSのバージョン(IEに対応しているかどうか)

検証結果

  セッションの引継ぎ 起動するブラウザ 対応OSのバージョン(IEに対応しているかどうか)
Runtime.exec なし。常に新規ウィンドウが起動する。* 指定したパス上のアプリケーション* 対応している*
BareBonesBrowserLaunch 既存のセッションを利用 デフォルトブラウザ 対応している
BasicService 別セッション デフォルトブラウザ 対応している
Desktop 既存のセッションを利用 デフォルトブラウザ 対応している

*アプリパスを指定して起動した場合。

検証

Runtime.exec

Rntime.getRuntime().exec()の引数に以下のように直接アプリケーションとURLを指定して起動する方法。

new String[]{“C:\\Program Files\\Internet Explorer\\iexplore.exe”,”http://www.google.co.jp”}

当然のようにパスを指定する必要があるため、実用は難しい
ただし、後述するBareBonesBrowserLaunchのようにWindowsの場合であれば、

rundll32 url.dll,FileProtocolHandler

を第一引数として渡せばその限りではない。

#!java
public class BrowserTest extends JFrame {
    public static String TARGET_URL = "http://www.google.co.jp";

    public static void main(String argv[]) {
        BrowserTest frame = new BrowserTest();
        JButton button = new JButton("test");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // RuntimeExecでテスト
                // http://developer.apple.com/jp/technotes/tn1168.html
                // http://java.sun.com/javase/ja/6/docs/ja/api/index.html
                try {
                    Runtime.getRuntime().exec(new String[]{"C:\\Program Files\\Internet Explorer\\iexplore.exe",TARGET_URL});
                } catch (IOException e1) {
                    // TODO 自動生成された catch ブロック
                    e1.printStackTrace();
                }
            }
        });
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

BareBonesBrowserLaunch

windowsの場合は、内部でRuntime.exec()を実行しており、rundll32を使用してデフォルトブラウザを呼び出している。
Runtime.getRuntime().exec(“rundll32 url.dll,FileProtocolHandler ” + url);

public class BrowserTest extends JFrame {
    public static String TARGET_URL = "http://www.google.co.jp";
 
   public static void main(String argv[]) {
        BrowserTest frame = new BrowserTest();
        JButton button = new JButton("test");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // http://www.centerkey.com/java/browser/
                BareBonesBrowserLaunch.openURL(TARGET_URL);
            }
        });
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

BareBonesBrowserLaunch

実行する前にjar化して、JavaWebStartから実行しないと、lookupでエラーになるので注意。
要jnlp.jar。JavaWebStartのRuntimeの場合は既にパスが通っているのであわせて配布は不要。
開発時などにmainからの起動をした場合は正常に起動しないのでちょっとテストしづらい。

public class BrowserTest extends JFrame {
    public static String TARGET_URL = "http://www.google.co.jp";

    public static void main(String argv[]) {
        BrowserTest frame = new BrowserTest();
        JButton button = new JButton("test");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javaws/developersguide/examples.html#BasicService
                try {
                    BasicService basicService = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
                    basicService.showDocument(new URL(TARGET_URL));
                } catch (MalformedURLException e1) {
                    // TODO 自動生成された catch ブロック
                    e1.printStackTrace();
                } catch (UnavailableServiceException e1) {
                    // TODO 自動生成された catch ブロック
                    e1.printStackTrace();
                }
            }
        });
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

java.awt.Desktop

java6以上が必須。

public class BrowserTest extends JFrame {
    public static String TARGET_URL = "http://www.google.co.jp";

    public static void main(String argv[]) {
        BrowserTest frame = new BrowserTest();
        JButton button = new JButton("test");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // https://java.sun.com/javase/ja/6/docs/ja/api/java/awt/Desktop.html
                try {
                    Desktop.getDesktop().browse(new URI(TARGET_URL));
                } catch (IOException e1) {
                    // TODO 自動生成された catch ブロック
                    e1.printStackTrace();
                } catch (URISyntaxException e1) {
                    // TODO 自動生成された catch ブロック
                    e1.printStackTrace();
                }
            }
        });
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

とりあえず、今回の要件としてはjava5でJavaWebStartのRuntime起動なので、BasicServiceの方向でいきそう。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。