: O. Yuanying

Javaアプリケーションからブラウザを開く

Swingのアプリケーションを作っていると、たまにアプリケーション側からブラウザを開きたい場合があります。 Appletの場合はAppletContext#showDocumentにURLを引数として渡せば、Appletが開いているブラウザでURLを開くことができますが、普通のアプリケーションの場合どうするのだろうか?

1.Runtime.exec を使って URL を開く

Apple開発者用ページで紹介されている、たぶん最も原始的な方法。

おそらくJDK1.0から可能。

try {
//ブラウザを起動し、必要な URL を渡す
Runtime.getRuntime().exec(newString[ ] {browserName, url});

} catch (IOException exc) {
exc.printStackTrace();
}

問題は、

  • 使用するブラウザを予め決め打ちしておくか、もしくはユーザに自分で設定させる必要があること。
  • 「ブラウザ url」と、ブラウザの実行ファイルの第一引数にurlを与えると、そのブラウザでそのページが立ち上がる、と決め打ちされていること。

使用されるOSが固定されている場合だったら、使用するブラウザを予め決め打ちしておいても良いと思うけど、それはJavaの思想に反するよね。

というわけで次の解決策。

2.BrowserLauncherを使う

Appleの開発者用ページでも言及されているので使ったことある人も多いかも。

ソースを読んでみるとどうやら、このライブラリはOSとそのバージョンをシステム情報から読み込み、適切なブラウザと適切な方法でブラウザを開いてくれるらしい。

使い方もすごい簡単。

BrowserLauncher.openURL(url);

以上。

けどまたこの方法にも微妙に問題点がある。

  • OSによって使用するブラウザが固定されてしまう。(WindowsでユーザがFirefoxをデフォルトブラウザに設定していても、IEを開いてしまう。)
  • 対応していないOSではブラウザを開けない。(ブラウザが使用可能であっても。)

欲を言えば開かせるブラウザはそのOSのシェルにまかせて、ユーザがOSで設定したデフォルトのブラウザでページを開きたいよね。

3.javax.jnlp.BasicService.showDocumentを使う

これはなかなか良さそうだ。

javax.jnlp.BasicService サービスが提供する一連のメソッドを使えば、環境に対する問い合わせや対話を行えます。これらのメソッドは、AppletContext が Java アプレットに対して提供するメソッドに似ています。

showURL メソッドは JNLP API を使って、プラットフォーム上のデフォルトブラウザに対し、指定された URL を表示するよう指示します。このメソッドは、要求が成功した場合には true を返し、そうでない場合には false を返します。

import javax.jnlp.*;
   ...

   // Method to show a URL
   boolean showURL(URL url) {
       try {
           // Lookup the javax.jnlp.BasicService object
           BasicService bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
           // Invoke the showDocument method
           return bs.showDocument(url);
       } catch(UnavailableServiceException ue) {
           // Service is not supported
           return false;
       }
    }

Sunが提供しているjnlp.jarを使えばプラットフォーム上のデフォルトブラウザでURLを表示することができるようだ。

4.Java SE 6 Mustangを使う

しかしまた、何で「OSにインストールされているブラウザを使ってURLを表示する」というたったこれだけの処理のためにこんな面倒な事をしないとならないんだろう?(OSを限定してしまったり、外部ライブラリを使用したり)

Java SE 6 Mustangになれば、それは解決するようだ。標準ライブラリに含まれているjava.awt.Desktopの機能を使用することでブラウザを簡単に起動することができるようになるみたいだ。

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
 
public class DesktopSample1 {
    public DesktopSample1() throws URISyntaxException, IOException {
        Desktop desktop = Desktop.getDesktop();
 
        desktop.browse(new URI("http://google.co.jp"));
    }
 
    public static void main(String[] args) {
        try {
            new DesktopSample1();
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

うーん、Mustangの正式リリースが待ちきれん。