programing

Java를 사용하여 기본 웹 브라우저를 여는 방법

goodsources 2022. 11. 10. 20:54
반응형

Java를 사용하여 기본 웹 브라우저를 여는 방법

기본 웹 브라우저를 열고 페이지를 "www.example.com"으로 설정하는 올바른 방법을 알려주실 수 있나요?

java.awt.Desktop 당신이 찾고 있는 클래스입니다.

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

// ...

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

델의 솔루션Desktop.isDesktopSupported()동작하지 않습니다(Windows 7 및 ubuntu).Java 코드에서 브라우저를 열려면 다음을 수행하십시오.

Windows:

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

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

Linux:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
String[] browsers = { "google-chrome", "firefox", "mozilla", "epiphany", "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();

Windows:

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();
            }
        }
    }
}

Tim Cooper가 제공한 답변에서 언급한 바와 같이,java.awt.Desktop는 Java 버전6(1.6)부터 이 기능을 제공했지만 다음 주의사항이 있습니다.

isDesktopSupported() 메서드를 사용하여 Desktop API를 사용할 수 있는지 여부를 확인합니다.Solaris 운영체제시스템 및 Linux 플랫폼에서는 이 API는 Gnome 라이브러리에 의존합니다.이러한 라이브러리를 사용할 수 없는 경우 이 메서드는 false를 반환합니다.

지원 또는 제공하지 않는 플랫폼용java.awt.DesktopBrowser Launcher2 프로젝트를 조사합니다.Eric Albert가 원래 작성 및 공개한 Browser Launcher 클래스에서 파생되어 다소 업데이트되었습니다.2000년대 초에 웹 브라우저 인터페이스와 함께 로컬로 실행되었던 멀티 플랫폼 Java 어플리케이션에서 Browser Launcher 클래스를 성공적으로 사용했습니다.

Browser Launcher2는 GNU Lesser General Public License에 따라 라이선스가 부여됩니다.해당 라이선스를 사용할 수 없는 경우 매우 자유로운 라이선스를 가진 원본 Browser Launcher 복사본을 찾습니다.

이 코드는 Eric Albert(ejalbert@cs.stanford.edu)에 의한 Copyright 1999-2001이며, 이 단락에서 코멘트의 말미까지 이 코멘트의 일부가 삭제되지 않는 한, 어떠한 형태로도 제한 없이 재배포 또는 수정할 수 있습니다.작성자는 이 코드를 사용하는 응용 프로그램, 애플릿 또는 기타 바이너리를 통지받기를 요청하지만, 이는 무엇보다 호기심 때문이며 필수는 아닙니다.이 소프트웨어에는 보증이 포함되어 있지 않습니다.본 소프트웨어의 사용으로 인한 데이터나 기능의 손실이나 부작용 또는 예기치 않은 영향에 대해서는 책임지지 않습니다.

크레딧:스티븐 스펜서, 자바월드 매거진(Java Tip 66) 론 B씨도 감사합니다.Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantore, Larry Barowski, Trevor Bedzek, Frank Miedrich 및 Ron Rabakukk

또한 Browser Launcher2 이외의 프로젝트에서는 2001년 이후 브라우저 및 기본 시스템 보안 설정 변경을 고려하도록 원래 Browser Launcher가 업데이트되었을 수 있습니다.

또한 Runtime을 사용하여 크로스 플랫폼 솔루션을 생성할 수도 있습니다.

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

public class App {

    public static void main(String[] args) throws Exception {
        String url = "http://stackoverflow.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);
        }
    }
}

괜찮으시다면 좋겠는데, 제가 모든 도움이 되는 것들을 위에서 꾸몄고, 시험을 위한 완벽한 수업을 준비했습니다.

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);
    }
}

매우 간단합니다. 코드 아래에 적어주세요.

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로 브라우저를 자동으로 엽니다.

위의 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 에서는, start 커맨드를 사용해 「default /k start http://www.example.com」Infact 를 기동할 수 있습니다.exstart abc.mp3는 기본 mp3 플레이어를 호출하고 요청된 mp3 파일을 로드합니다.

JavaFX는 AWT와는 독립된 크로스 플랫폼솔루션을 내부에 번들하고 있습니다.이것은 krzysiek.ste의 답변과 다소 유사합니다.

내가 다시 썼어 몇 가지 내용을 포함하도록xdg-open)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 스니펫입니다.

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)Linux에서 하고 있지만 Fedora Linux에서는 장애가 하고 있습니다.BrowserUtil.browse(uri)

JetBrains가 브라우저를 여는 데 이 방법이 현재 선호되고 있다고 생각합니다(를 들어 이 스레드 참조).

언급URL : https://stackoverflow.com/questions/5226212/how-to-open-the-default-webbrowser-using-java

반응형