Как открыть браузер по умолчанию с помощью Java

Может кто-нибудь указать мне правильное направление, как открыть веб-браузер по умолчанию и установить страницу "www.example.com" спасибо

12 ответов

java.awt.Desktop это класс, который вы ищете.

import java.awt.Desktop;
import java.net.URI;

// ...

if (Desktop.isDesktopSupported() && Desktop.isSupported(Desktop.Action.BROWSE)) {
    Desktop.getDesktop().browse(new URI("http://www.example.com"));
}

Для меня решение с Desktop.isDesktopSupported() не работает (Windows 7 и Ubuntu). Пожалуйста, попробуйте это, чтобы открыть браузер из кода Java:

Окна:

Runtime rt = Runtime.getRuntime();
String url = "http://stackru.com";
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);

макинтош

Runtime rt = Runtime.getRuntime();
String url = "http://stackru.com";
rt.exec("open " + url);

Linux:

Runtime rt = Runtime.getRuntime();
String url = "http://stackru.com";
String[] browsers = { "epiphany", "firefox", "mozilla", "konqueror",
                                 "netscape", "opera", "links", "lynx" };

StringBuffer cmd = new StringBuffer();
for (int i = 0; i < browsers.length; i++)
    if(i == 0)
        cmd.append(String.format(    "%s \"%s\"", browsers[i], url);
    else
        cmd.append(String.format(" || %s \"%s\"", browsers[i], url); 
    // If the first didn't work, try the next browser and so on

rt.exec(new String[] { "sh", "-c", cmd.toString() });

Если вы хотите иметь мультиплатформенное приложение, вам нужно добавить проверку операционной системы (например):

String os = System.getProperty("os.name").toLowerCase();

Окна:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

os.indexOf("nix") >=0 || os.indexOf("nux") >=0

Вот мой код Он откроет данный URL в браузере по умолчанию (кроссплатформенное решение).

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class Browser {
    public static void main(String[] args) {
        String url = "http://www.google.com";

        if(Desktop.isDesktopSupported()){
            Desktop desktop = Desktop.getDesktop();
            try {
                desktop.browse(new URI(url));
            } catch (IOException | URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            Runtime runtime = Runtime.getRuntime();
            try {
                runtime.exec("xdg-open " + url);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

Надеюсь, вы не возражаете, но я собрал все полезные вещи сверху и придумал полный класс, готовый к тестированию...

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class MultiBrowPop {

    public static void main(String[] args) {
        OUT("\nWelcome to Multi Brow Pop.\nThis aims to popup a browsers in multiple operating systems.\nGood luck!\n");

        String url = "http://www.birdfolk.co.uk/cricmob";
        OUT("We're going to this page: "+ url);

        String myOS = System.getProperty("os.name").toLowerCase();
        OUT("(Your operating system is: "+ myOS +")\n");

        try {
            if(Desktop.isDesktopSupported()) { // Probably Windows
                OUT(" -- Going with Desktop.browse ...");
                Desktop desktop = Desktop.getDesktop();
                desktop.browse(new URI(url));
            } else { // Definitely Non-windows
                Runtime runtime = Runtime.getRuntime();
                if(myOS.contains("mac")) { // Apples
                    OUT(" -- Going on Apple with 'open'...");
                    runtime.exec("open " + url);
                } 
                else if(myOS.contains("nix") || myOS.contains("nux")) { // Linux flavours 
                    OUT(" -- Going on Linux with 'xdg-open'...");
                    runtime.exec("xdg-open " + url);
                }
                else 
                    OUT("I was unable/unwilling to launch a browser in your OS :( #SadFace");
            }
            OUT("\nThings have finished.\nI hope you're OK.");
        }
        catch(IOException | URISyntaxException eek) {
            OUT("**Stuff wrongly: "+ eek.getMessage());
        }
    }

    private static void OUT(String str) {
        System.out.println(str);
    }
}

Как отмечено в ответе, предоставленном Тимом Купером, java.awt.Desktop предоставляет эту возможность начиная с версии Java 6 (1.6), но со следующим предупреждением:

Используйте метод isDesktopSupported(), чтобы определить, доступен ли Desktop API. В операционной системе Solaris и платформе Linux этот API зависит от библиотек Gnome. Если эти библиотеки недоступны, этот метод вернет false.

Для платформ, которые не поддерживают или не предоставляют java.awt.Desktop, загляните в проект BrowserLauncher2. Он получен и несколько обновлен от класса BrowserLauncher, первоначально написанного и выпущенного Эриком Альбертом. Я успешно использовал исходный класс BrowserLauncher в многоплатформенном приложении Java, которое в начале 2000-х годов работало локально с интерфейсом веб-браузера.

Обратите внимание, что BrowserLauncher2 распространяется под лицензией GNU Lesser General Public License. Если эта лицензия неприемлема, найдите копию оригинального BrowserLauncher с очень либеральной лицензией:

Этот код защищен авторским правом Эрика Альберта 1999-2001 гг. (Ejalbert@cs.stanford.edu) и может распространяться или изменяться в любой форме без ограничений до тех пор, пока часть этого комментария из этого абзаца до конца комментария не будет удалена, Автор просит, чтобы его уведомили о любом приложении, апплете или другом двоичном файле, который использует этот код, но это скорее из любопытства, чем что-либо другое, и не требуется. Это программное обеспечение не включает никаких гарантий. Автор не несет ответственности за потерю данных или функциональности, а также за любые неблагоприятные или неожиданные последствия использования данного программного обеспечения.

Кредиты: Стивен Спенсер, журнал JavaWorld (Java Tip 66). Спасибо также Рону Б. Йе, Эрику Шапиро, Бену Энгберу, Полу Тейтлебауму, Андреа Кантаторе, Ларри Баровски, Тревору Бедзеку, Фрэнку Мидричу и Рону Рабакукку

Проекты, отличные от BrowserLauncher2, возможно, также обновили исходный BrowserLauncher для учета изменений в браузере и системных настройках безопасности по умолчанию с 2001 года.

Это очень просто, просто напишите код ниже:

String s = "http://www.google.com";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

или если вы не хотите загружать URL, просто напишите имя вашего браузера в строковые значения, такие как,

String s = "chrome";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

после запуска программы он автоматически откроет браузер с пустым URL

Вы также можете использовать Runtime для создания кроссплатформенного решения:

import java.awt.Desktop;
import java.net.URI;

public class App {

    public static void main(String[] args) throws Exception {
        String url = "http://stackru.com";

        if (Desktop.isDesktopSupported()) {
            // Windows
            Desktop.getDesktop().browse(new URI(url));
        } else {
            // Ubuntu
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("/usr/bin/firefox -new-window " + url);
        }
    }
}

Я переделал ответ Brajesh Kumar выше в Clojure следующим образом:

(defn open-browser 
  "Open a new browser (window or tab) viewing the document at this `uri`."
  [uri]
  (if (java.awt.Desktop/isDesktopSupported)
    (let [desktop (java.awt.Desktop/getDesktop)]
      (.browse desktop (java.net.URI. uri)))
    (let [rt (java.lang.Runtime/getRuntime)]
      (.exec rt (str "xdg-open " uri)))))

на случай, если это кому-нибудь пригодится.

В Windows вызывайте "cmd / k start http://www.example.com/". Фактически вы всегда можете вызывать программы "по умолчанию" с помощью команды запуска. Для начала abc.mp3 запустит mp3-плеер по умолчанию и загрузит запрошенный mp3-файл.

JavaFX включает в себя кроссплатформенное решение.StandaloneHostServiceэто не зависит от AWT, что чем-то похоже на ответ krzysiek.ste.

Я переписал его, включив в него некоторые альтернативы (которые на самом деле используютсяxdg-openкстати).

      private static final String[][] commands = new String[][]{
        {"xdg-open", "$1"},
        {"gio", "open", "$1"},
        {"gvfs-open", "$1"},
        {"gnome-open", "$1"},  // Gnome
        {"mate-open", "$1"},  // Mate
        {"exo-open", "$1"},  // Xfce
        {"enlightenment_open", "$1"},  // Enlightenment
        {"gdbus", "call", "--session", "--dest", "org.freedesktop.portal.Desktop",
            "--object-path", "/org/freedesktop/portal/desktop",
            "--method", "org.freedesktop.portal.OpenURI.OpenURI",
            "", "$1", "{}"},  // Flatpak
        {"open", "$1"},  // Mac OS fallback
        {"rundll32", "url.dll,FileProtocolHandler", "$1"},  // Windows fallback
};

Вот окончательный фрагмент Java, избегающий проблем с конкатенацией строк и escape-символами.

      public static void showDocument(final String uri) {
    String osName = System.getProperty("os.name");
    try {
        if (osName.startsWith("Mac OS")) {
            Runtime.getRuntime().exec(new String[]{"open", uri});
        } else if (osName.startsWith("Windows")) {
            Runtime.getRuntime().exec(new String[]{"rundll32", "url.dll,FileProtocolHandler", uri});
        } else { //assume Unix or Linux
            new Thread(() -> {
                try {
                    for (String[] browser : commands) {
                        try {
                            String[] command = new String[browser.length];
                            for (int i = 0; i < browser.length; i++)
                                if (browser[i].equals("$1"))
                                    command[i] = uri;
                                else
                                    command[i] = browser[i];
                            if (Runtime.getRuntime().exec(command).waitFor() == 0)
                                return;
                        } catch (IOException ignored) {
                        }
                    }
                    String browsers = System.getenv("BROWSER") == null ? "x-www-browser:firefox:iceweasel:seamonkey:mozilla:" +
                            "epiphany:konqueror:chromium:chromium-browser:google-chrome:" +
                            "www-browser:links2:elinks:links:lynx:w3m" : System.getenv("BROWSER");
                    for (String browser : browsers.split(":")) {
                        try {
                            Runtime.getRuntime().exec(new String[]{browser, uri});
                            return;
                        } catch (IOException ignored) {
                        }
                    }
                } catch (Exception ignored) {
                }
            }).start();
        }
    } catch (Exception e) {
        // should not happen
        // dump stack for debug purpose
        e.printStackTrace();
    }
}

А также есть

      BrowserUtil.browse(uri);

(исходный код ), который кажется более совместимым с некоторыми более экзотическими настройками. Недавно у меня был клиент,Desktop.getDesktop().browse(uri)не работал в Fedora Linux, ноBrowserUtil.browse(uri)работал.

Я также считаю, что теперь JetBrains предпочитает открывать браузер (например, см. эту ветку )

Поскольку у меня была такая же проблема, и я не нашел достойного решения для нашего случая, поэтому я портировал https://www.npmjs.com/package/open пакет npm на Java https://github.com/vaadin/open и выпустил его в Центральный Мейвен. Может использоваться как

      <dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>open</artifactId>
    <version>8.4.0.2</version>
</dependency>
      Open.open("https://stackoverflow.com/")

или для конкретного браузера

      Open.open("https://stackoverflow.com/", App.FIREFOX);
Другие вопросы по тегам