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


답변:


161

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

3
크로스 플랫폼 솔루션입니까 아니면 Windows 전용입니까? 이 스레드의 다른 답변은 Linux 용 런타임 클래스를 사용하도록 제안합니다
isapir

@lgal, Windows 7과 Linux (Ubuntu 10.10) 모두에서 저에게 효과적이었습니다. 항상 기본 시스템 브라우저를 엽니 다 (제 경우에는 Win7의 IE 및 Ubuntu의 Firefox)
Joaquim Oliveira

1
이것은 나를 위해 작동하지 않습니다. IsDesktopSupported 메서드는 내 Windows 컴퓨터에서 항상 false를 반환합니다. 무슨 일이야?
krzysiek.ste

2
사용자가 "html"과 같은 파일 확장명에 사용자 정의 "연결 프로그램"동작을 할당 한 경우 브라우저는 열리지 않지만 사용자가 링크 한 프로그램은 열리지 않습니다 .... 이것은 전혀 해결책이 아닙니다!
thesaint

4
@ krzysiek.ste는 Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)대신 수표를 사용합니다 .
Thibstars

35

다음은 내 코드입니다. 기본 브라우저 (크로스 플랫폼 솔루션)에서 주어진 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();
            }
        }
    }
}

2
" 'xdg-open'은 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다."
xehpuk

10
그것은 유닉스 명령입니다. 무엇 당신은 윈도우에서 실행하고있는
OLU 스미스

7
'Desktop.isDesktopSupported ()'와 함께 'Desktop.getDesktop (). isSupported (Action.BROWSE)'도 확인하십시오.
Kanchu

35

나를 위해 솔루션이 Desktop.isDesktopSupported()작동하지 않습니다 ( windows 7ubuntu ). 자바 코드에서 브라우저를 열려면 이것을 시도하십시오 :

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 = { "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();

Windows :

os.indexOf("win") >= 0

맥:

os.indexOf("mac") >= 0

Linux :

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

1
여기에서 StringBuffer를 사용하는 이유는 무엇입니까?
Stephan

2
Linux 솔루션의 모든 브라우저를 나열하는 것은 매우 나쁩니다. 목록에있는 브라우저가 아닌 다른 브라우저를 사용하면 어떻게됩니까? (목록에 크롬이나 크롬이 없습니다) 아니면 Epiphany와 Firefox가 둘 다 있지만 후자를 선호합니까? xdg-open이 경우 사용하는 것이 훨씬 좋습니다. 따라서 솔루션은 macOS만큼 간단 할 수 있습니다.
m4tx 2017

Windows의 또 다른 옵션은 rt.exec ( "start \" "+ url +"\ ");
Ivan Nikitin

6

런타임 을 사용하여 크로스 플랫폼 솔루션을 만들 수도 있습니다 .

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

5

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

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

를 지원하거나 제공하지 않는 플랫폼의 java.awt.Desktop경우 BrowserLauncher2 프로젝트를 살펴보세요 . BrowserLauncher 에서 파생되고 다소 업데이트됩니다.Eric Albert가 처음 작성하고 출시 한 클래스 . 2000 년대 초에 웹 브라우저 인터페이스로 로컬에서 실행 된 다중 플랫폼 Java 응용 프로그램에서 원래 BrowserLauncher 클래스를 성공적으로 사용했습니다.

BrowserLauncher2는 GNU Lesser General Public License에 따라 사용이 허가되었습니다 . 해당 라이센스가 허용되지 않는 경우 매우 자유로운 라이센스가있는 원래 BrowserLauncher의 사본을 찾으십시오.

이 코드는 Eric Albert (ejalbert@cs.stanford.edu)의 Copyright 1999-2001이며이 단락에서 주석 끝까지이 주석의 일부가 제거되지 않는 한 제한없이 어떤 형태로든 재배포하거나 수정할 수 있습니다. . 작성자는이 코드를 사용하는 응용 프로그램, 애플릿 또는 기타 바이너리에 대한 알림을받을 것을 요청하지만, 이는 무엇보다 호기심에서 벗어나 필수 사항이 아닙니다. 이 소프트웨어는 보증을 포함하지 않습니다. 작성자는 데이터 또는 기능의 손실 또는이 소프트웨어 사용으로 인한 부정적 또는 예상치 못한 영향에 대해 책임을지지 않습니다.

크레딧 : Steven Spencer, JavaWorld 매거진 (Java Tip 66) Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich 및 Ron Rabakukk에게도 감사드립니다.

BrowserLauncher2 이외의 프로젝트는 2001 년 이후 브라우저 및 기본 시스템 보안 설정의 변경 사항을 고려하여 원래 BrowserLauncher를 업데이트했을 수도 있습니다.


BrowserLauncher2의 유지 관리 포크는 github.com/rajing/browserlauncher2
koppor

1
Mac에서 BrowserLauncher2를 사용하려는 사람들의 경우 원래 BrowserLauncher2 또는 @koppor에서 언급 한 포크가 Mac OS X Sierra에서 작동하지 않습니다. 둘 다 분명히 더 이상 존재하지 않는 "mrj.version"시스템 속성이 있다고 가정합니다. 런처가 생성되면 코드에서 NullPointerException이 발생합니다. 추가 정보는 sourceforge.net/p/browserlaunch2/bugs/14 를 참조하십시오 .
Coren 2017-07-20

4

매우 간단하게 아래 코드를 작성하십시오.

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로 브라우저가 자동으로 열립니다.


1

Windows에서는 "cmd / k start http://www.example.com "을 호출합니다. 실제로 시작 명령을 사용하여 항상 "기본"프로그램을 호출 할 수 있습니다. 예를 들어 abc.mp3는 기본 mp3 플레이어를 호출하고 요청 된 mp3 파일을로드합니다.


이미 휴대용 버전을 게시했습니다. 기본 프로그램에서 열어야하는 URL이 아니라면 염두에 둘 수있는 또 다른 솔루션을 제안 했습니다.
d-live

1

괜찮으 시겠지만 저는 위에서부터 모든 도움이되는 것들을 모아서 테스트 할 준비가 된 완전한 수업을 생각해 냈습니다 ...

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

1

위의 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)))))

누구에게나 유용 할 경우를 대비하여.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.