题
我有一个用Java编写的应用程序。 它被devise为独立运行在一个Linux机器上。 我正试图产生一个新的Firefox窗口。 但是, Firefox永远不会打开。 它总是有一个shell退出代码1.我可以用gnome-terminal运行这个相同的代码,并打开罚款。
背景
所以,这里是它的初始化过程:
一旦程序运行,用户可以点击一个button,产生一个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; } }
在阅读了各种答案和各种评论(来自提问者)之后,我会做些什么
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!
如果您可以缩小到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(); } } }
使用BrowserLauncher 。
调用它非常简单,就去吧
new BrowserLauncher().openURLinBrowser("http://www.google.com");
如果你阅读并显示标准的输出/错误流,你可能会有更好的运气,所以你可以捕获任何错误消息,Firefox可能会打印。
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()); }