从Java程序中打开浏览器窗口

6

问题

我有一个用Java编写的应用程序。它设计为在Linux系统上独立运行。我试图生成一个新的firefox窗口,但是firefox从未打开过。它总是具有退出代码1的shell。我可以使用gnome-terminal运行相同的代码,并且它可以正常打开。

背景

所以,这是它的初始化过程:

  1. 启动X "Xorg :1 -br -terminate -dpms -quiet vt7"
  2. 启动窗口管理器 "metacity --display=:1 --replace"
  3. 配置资源 "xrdb -merge /etc/X11/Xresources"
  4. 成为守护进程并断开与控制终端的连接

一旦程序运行起来,用户可以点击一个按钮来生成一个firefox窗口。以下是我的代码。请记住,X正在显示:1。

代码


public boolean openBrowser()
{
  try {
    Process oProc = Runtime.getRuntime().exec( "/usr/bin/firefox --display=:1" );
    int bExit = oProc.waitFor();  // This is always 1 for some reason

    return true;

  } catch ( Exception e ) {
    oLogger.log( Level.WARNING, "Open Browser", e );
    return false;
  }
}

你是正确的。不知何故我在打字之前就发了出去。现在应该完整呈现出来了。 - Ryan Ayers
5个回答

9
如果您可以缩小到Java 6,您可以使用桌面API:

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/

应该看起来像这样:
    if (Desktop.isDesktopSupported()) {
        Desktop desktop = Desktop.getDesktop();
        if (desktop.isSupported(Desktop.Action.BROWSE)) {
            try {
                desktop.browse(new URI("http://localhost"));
            }
            catch(IOException ioe) {
                ioe.printStackTrace();
            }
            catch(URISyntaxException use) {
                use.printStackTrace();
            }
        }
    }

2
我尝试使用这个,但是出现了回溯。<pre><code> java.io.IOException: 无法显示URI: at sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:75) at sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:64) at java.awt.Desktop.browse(Desktop.java:368) </code></pre> - Ryan Ayers

4

使用BrowserLauncher

调用它非常容易,只需执行以下操作即可:

new BrowserLauncher().openURLinBrowser("http://www.google.com");

2

在阅读了各种答案和提问者的评论后,这是我会做的事情:

1)尝试使用Java方法http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();

查看更多有关该类的信息:

http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#2
http://www.javabeat.net/tips/8-using-the-new-process-builder-class.html

2) 从 C/C++/ruby/python 尝试启动火狐浏览器,查看是否成功。

3) 如果所有尝试都失败了,我会启动一个 shell 程序,让该 shell 程序来启动火狐浏览器!!


这个方法可行。事实证明,由于我没有运行桌面环境,我必须设置HOME环境变量才能使Firefox正常运行。 - Ryan Ayers

0
try {
     String url = "http://www.google.com";
     java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
} catch (java.io.IOException e) {
     System.out.println(e.getMessage());
}

0

如果您读取并显示标准输出/错误流,那么您可能会更幸运,因为这样您就可以捕获Firefox可能打印的任何错误消息。


我似乎无法从Firefox获得任何输出。 - Ryan Ayers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接