Eclipse IDE에서 java.io.Console 지원


103

Eclipse IDE를 사용하여 Java 프로젝트를 개발, 컴파일 및 실행합니다. 오늘 저는java.io.Console 클래스 출력과 더 중요한 사용자 입력을 관리 .

문제는 응용 프로그램이 Eclipse를 "통해"실행될 때 System.console()반환 된다는 것 null입니다. Eclipse는 익숙한 콘솔 창을 사용하여 최상위 프로세스가 아닌 백그라운드 프로세스에서 프로그램을 실행합니다.

Eclipse가 프로그램을 최상위 프로세스로 실행하도록 강제하거나 최소한 JVM이 인식 할 콘솔을 만드는 방법이 있습니까? 그렇지 않으면 프로젝트를 jar up하고 Eclipse 외부의 명령 줄 환경에서 실행해야합니다.


또한 참조 stackoverflow.com/questions/26470972/...를 내가 확인 System.out하고 System.in내 사용 사례에 대한 충분하고 사용 abondaned하기 System.console().
OneWorld

프로젝트를 실행 가능한 항아리로 내보냈지만 여전히 콘솔 null 오류가 발생합니다
Abhigyan

답변:


50

Eclipse에서 단계별 디버깅을 사용할 수 있기를 원한다고 가정합니다. JRE 클래스 경로의 bin 디렉토리에 빌드 된 클래스를 설정하여 외부에서 클래스를 실행할 수 있습니다.

java -cp workspace\p1\bin;workspace\p2\bin foo.Main

원격 디버거를 사용하여 디버깅하고 프로젝트에 빌드 된 클래스 파일을 활용할 수 있습니다.

이 예에서 Eclipse 프로젝트 구조는 다음과 같습니다.

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java

1. 디버그 모드에서 JVM 콘솔 시작

debug.batcmd.exe 콘솔 에서 외부 적으로 실행해야하는 Windows 배치 파일입니다 .

@ECHO OFF
SET A_PORT=8787
SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y
java.exe %A_DBG% -cp .\bin Main

인수에서 디버그 포트는 8787 로 설정되었습니다 . 은 중단 = y를 인수 디버거가 첨부 될 때까지 대기하도록 JVM을 알려줍니다.

2. 디버그 시작 구성 만들기

Eclipse에서 디버그 대화 상자 (실행> 디버그 대화 상자 열기 ...)를 열고 다음 설정 으로 새 원격 Java 애플리케이션 구성을 작성하십시오.

  • 프로젝트 : 프로젝트 이름
  • 연결 유형 : 표준 (소켓 부착)
  • 호스트 : localhost
  • 포트 : 8787

3. 디버깅

따라서 앱을 디버깅 할 때마다해야 할 일은 다음과 같습니다.

  • 중단 점을 설정
  • 콘솔에서 배치 파일 시작
  • 디버그 구성 시작

이 문제는 버그 122429 에서 추적 할 수 있습니다 . 여기에 설명 된대로 추상화 계층을 사용하여 응용 프로그램에서이 문제를 해결할 수 있습니다 .


1
또한 pause그 배치 파일의 끝에를 넣어 닫히기 전에 깜박이는 오류 메시지를 볼 수 있습니다.
Matt Lyons 2012 년

10
이것은 저에게 마지막 빨대입니다. 디버깅을 위해이 모든 작업을 수행해야한다면 Netbeans로 다시 전환합니다. Eclipse의 수정되지 않은 버그와 UI 성가심은 재미도 없습니다.
nuzzolilo

@Nuzzolilo, 이것은 원격 디버깅을위한 것입니다. 이 모든 것없이 Eclipse에서 로컬로 디버깅 할 수 있습니다.
Laplie Anderson 2014

35

내가 사용하는 해결 방법은 Eclipse를 사용할 때 Console 대신 System.in/System.out을 사용하는 것입니다. 예를 들어 다음 대신 :

String line = System.console().readLine();

당신이 사용할 수있는:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();

20
그런 식으로 암호 마스킹을 사용하여 암호를 읽을 수 있다고 생각하지 않습니다.
Sualeh Fatehi

3
핸들 ... 그리고 하나 필요한 IOException경우에 발생되지 않습니다 Console.readLine().
dma_k 2011-07-25

5

이 문제가 발생하는 이유는 eclipse가 앱을 시스템 콘솔의 최상위 프로세스가 아닌 백그라운드 프로세스로 실행하기 때문입니다.


5

클래스를 직접 구현할 수 있습니다. 다음은 그 예입니다.

public class Console {
    BufferedReader br;
    PrintStream ps;

    public Console(){
        br = new BufferedReader(new InputStreamReader(System.in));
        ps = System.out;
    }

    public String readLine(String out){
        ps.format(out);
        try{
            return br.readLine();
        }catch(IOException e)
        {
            return null;
        }
    }
    public PrintStream format(String format, Object...objects){
        return ps.format(format, objects);
    }
}

4

http://www.stupidjavatricks.com/?p=43 에서 이것에 대해 뭔가를 찾았습니다 . .

그리고 슬프게도 콘솔이 최종이기 때문에이를 확장하여 system.in 및 system.out 주위에 래퍼를 만들 수 없습니다. Eclipse 콘솔 내부에서도 여전히 액세스 할 수 있습니다. 이것이 아마도 eclipse가 아직 콘솔에 이것을 연결하지 않은 이유 일 것입니다.

Setter없이 System.console 이외의 콘솔을 얻는 다른 방법을 원하지 않는 이유는 이해합니다.하지만 다른 사람이 클래스를 재정의 할 수 없도록하는 이유를 이해할 수 없습니다. 모의 / 테스트 콘솔 ...


4

또 다른 옵션은 두 옵션을 모두 래핑하는 메서드를 만들고 콘솔을 사용할 수 없을 때 System.in 메서드로 "장애 조치"하는 것입니다. 아래 예제는 매우 기본적인 예제입니다. 동일한 프로세스에 따라 필요에 따라 콘솔 (readPassword, 형식)에서 다른 메서드를 래핑 할 수 있습니다. 이렇게하면 Eclipse에서 즐겁게 실행할 수 있으며 배포시 콘솔 기능 (예 : 암호 숨기기)이 시작됩니다.

    private static String readLine(String prompt) {
        String line = null;
        Console c = System.console();
        if (c != null) {
             line = c.readLine(prompt);
        } else {
            System.out.print(prompt);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            try {
                 line = bufferedReader.readLine();
            } catch (IOException e) { 
                //Ignore    
            }
        }
        return line;
    }

2

내가 알 수있는 한, Eclipse에서 Console 객체를 가져올 수있는 방법이 없습니다. 콘솔! = null인지 확인한 다음 JAR을 실행하고 명령 줄에서 실행합니다.


1

Eclipse를 통해 애플리케이션을 실행할 때 java.io.Console 객체를 얻을 수있는 방법이없는 것 같습니다. 명령 행 콘솔 창은 백그라운드 프로세스로 실행되기 때문에 애플리케이션에서 열리지 않습니다 (Eclipse에 대한 백그라운드?). 현재이 문제를 처리 할 Eclipse 플러그인은 없습니다. 주로 java.io.Console이 최종 클래스이기 때문입니다.

실제로 할 수있는 일은 반환 된 Console 객체에서 null을 테스트하고 거기서부터 진행하는 것입니다.


1

링크 는 System.console () 사용에 대한 대안을 제공합니다. 하나는 System.in을 감싸는 BufferedReader를 사용하는 것이고, 두 번째는 System.in을 감싸는 스캐너를 사용하는 것입니다.

둘 다 콘솔만큼 간결하지는 않지만 둘 다 어리석은 것을 디버깅하지 않고도 일식에서 작동합니다!


0

Eclipse 작업 공간이 C : \ MyWorkspace이고 Maven 프로젝트 MyProject 내에 Java 애플리케이션을 작성했으며 Java 기본 클래스가 com.mydomain.mypackage.MyClass라고 가정 해 보겠습니다.

이 경우 System.console()명령 줄에서 사용 하는 기본 클래스를 실행할 수 있습니다 .

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass

NB1 : 메이븐 프로젝트가 아닌 경우 프로젝트 속성에서 출력 폴더를 확인하십시오. 자바 빌드 경로 | 출처. "대상 / 클래스"가 아닐 수 있습니다.

NB2 : 메이븐 프로젝트이지만 클래스가 src / test / java에있는 경우 "target \ classes"대신 "target \ test-classes"를 사용해야합니다.

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