Открыть окно браузера из программы Java

Вопрос

У меня есть приложение, написанное на Java. Он предназначен для автономной работы на Linux. Я пытаюсь создать новое окно Fire Fox. Однако Fire Fox никогда не открывается. Он всегда имеет код выхода оболочки 1. Я могу запустить тот же код с гном-терминал, и он открывается нормально.

Фон

Итак, вот процесс его инициализации:

  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 30.10.2008 01:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
1
15 367
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если вы можете сузить его до 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();
            }
        }
    }

Я пробовал использовать это, но получил обратную связь. <pre> <code> 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) </code> </pre>

Ryan Ayers 30.10.2008 01:00

Возможно, вам повезет больше, если вы прочитаете и отобразите стандартные потоки вывода / ошибок, чтобы вы могли поймать любое сообщение об ошибке, которое может напечатать firefox.

Кажется, я не могу получить никаких результатов от firefox.

Ryan Ayers 30.10.2008 01:09

Используйте БраузерЛаунчер.

Вызвать это очень просто, просто идите

new BrowserLauncher().openURLinBrowser("http://www.google.com");
Ответ принят как подходящий

прочитав различные ответы и различные комментарии (от спрашивающего), вот что я бы сделал

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) попробуйте сделать это (запустить firefox) из C / C++ / ruby ​​/ python и посмотреть, удастся ли это.

3) если все остальное не помогло, я бы запустил программу оболочки, и эта программа оболочки запустила firefox !!

Это сработало. Как оказалось, поскольку я не использую среду рабочего стола, мне пришлось установить переменную среды HOME для правильной работы firefox.

Ryan Ayers 30.10.2008 17:50
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());
}

Другие вопросы по теме