【问题标题】:Open Browser window from Java program从 Java 程序打开浏览器窗口
【发布时间】:2008-10-29 21:41:13
【问题描述】:

问题

我有一个用 Java 编写的应用程序。它旨在独立运行在 Linux 机器上。我正在尝试生成一个新的 firefox 窗口。但是,firefox 永远不会打开。它的 shell 退出代码始终为 1。我可以使用 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;
  }
}

【问题讨论】:

  • 你是对的。不知何故,我在完成打字之前发布了它。它现在应该已经完整了。

标签: java linux browser x11 daemon


【解决方案1】:

如果您可以将范围缩小到 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();
            }
        }
    }

【讨论】:

  • 我尝试使用它,但我得到了回溯。
     java.io.IOException: 无法显示 URI: 在 sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:75) 在 sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:64 ) 在 java.awt.Desktop.browse(Desktop.java:368) 
【解决方案2】:

使用BrowserLauncher

调用很简单,去吧

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

【讨论】:

    【解决方案3】:

    在阅读了各种答案和各种 cmets(来自提问者)之后,这就是我要做的事情

    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 执行此操作(启动 firefox),看看是否成功。

    3) 如果一切都失败了,我会启动一个 shell 程序,那个 shell 程序会启动 firefox!!

    【讨论】:

    • 这行得通。事实证明,由于我没有运行桌面环境,我必须设置 HOME 环境变量才能让 firefox 正常运行。
    【解决方案4】:

    如果您阅读并显示标准输出/错误流,您可能会有更好的运气,这样您就可以捕捉到 firefox 可能打印的任何错误消息。

    【讨论】:

    • 我似乎无法从 firefox 获得任何输出。
    【解决方案5】:
    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());
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2011-02-18
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      相关资源
      最近更新 更多