Hỗ trợ java.io.Console trong Eclipse IDE


103

Tôi sử dụng IDE Eclipse để phát triển, biên dịch và chạy các dự án Java của mình. Hôm nay, tôi đang cố gắng sử dụng java.io.Consolelớp để quản lý đầu ra và quan trọng hơn là đầu vào của người dùng.

Vấn đề là nó System.console()trả về nullkhi một ứng dụng được chạy "qua" Eclipse. Eclipse chạy chương trình trên một quy trình nền, thay vì một quy trình cấp cao nhất với cửa sổ giao diện điều khiển mà chúng ta đã quen thuộc.

Có cách nào để buộc Eclipse chạy chương trình như một quy trình cấp cao nhất, hoặc ít nhất là tạo một Bảng điều khiển mà JVM sẽ nhận ra không? Nếu không, tôi buộc phải chuẩn bị dự án và chạy trên môi trường dòng lệnh bên ngoài Eclipse.


Cũng xem stackoverflow.com/questions/26470972/… Tôi đã xác định System.outSystem.inđủ cho trường hợp sử dụng của mình và sử dụng trên máy bay System.console().
OneWorld

Tôi đã xuất dự án dưới dạng jar có thể chạy được, nhưng tôi vẫn gặp lỗi bảng điều khiển null
Abhigyan

Câu trả lời:


50

Tôi giả sử bạn muốn có thể sử dụng gỡ lỗi từng bước từ Eclipse. Bạn chỉ có thể chạy các lớp bên ngoài bằng cách đặt các lớp được xây dựng trong thư mục bin trên đường dẫn lớp JRE.

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

Bạn có thể gỡ lỗi bằng trình gỡ lỗi từ xa và tận dụng các tệp lớp được xây dựng trong dự án của bạn.

Trong ví dụ này, cấu trúc dự án Eclipse trông giống như sau:

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

1. Khởi động Bảng điều khiển JVM ở Chế độ gỡ lỗi

debug.bat là một tệp hàng loạt của Windows sẽ được chạy bên ngoài từ bảng điều khiển cmd.exe .

@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

Trong các đối số, cổng gỡ lỗi đã được đặt thành 8787 . Đối số Susan = y cho JVM đợi cho đến khi trình gỡ lỗi đính kèm.

2. Tạo cấu hình khởi chạy gỡ lỗi

Trong Eclipse, mở hộp thoại Gỡ lỗi (Chạy> Mở Hộp thoại Gỡ lỗi ...) và tạo cấu hình Ứng dụng Java Từ xa mới với các cài đặt sau:

  • Dự án: tên dự án của bạn
  • Loại kết nối: Tiêu chuẩn (Đính kèm ổ cắm)
  • Máy chủ: localhost
  • Cảng: 8787

3. Gỡ lỗi

Vì vậy, tất cả những gì bạn phải làm bất cứ lúc nào bạn muốn gỡ lỗi ứng dụng là:

  • thiết lập một điểm nghỉ
  • khởi chạy tệp loạt trong bảng điều khiển
  • khởi chạy cấu hình gỡ lỗi

Bạn có thể theo dõi vấn đề này trong lỗi 122429 . Bạn có thể giải quyết vấn đề này trong ứng dụng của mình bằng cách sử dụng một lớp trừu tượng như được mô tả ở đây .


1
Tôi cũng sẽ đặt một pauseở cuối tệp hàng loạt đó để bạn có thể thấy bất kỳ thông báo lỗi nào xuất hiện trước khi nó đóng.
Matt Lyons

10
Đây là ống hút cuối cùng đối với tôi. Nếu tôi phải làm tất cả những điều này chỉ để gỡ lỗi, tôi đang chuyển trở lại Netbeans. Vì vậy, nhiều lỗi chưa được khắc phục và những phiền toái về giao diện người dùng trong Eclipse, nó thậm chí còn không vui.
nuzzolilo

@Nuzzolilo, điều này chỉ để gỡ lỗi từ xa. Bạn có thể gỡ lỗi cục bộ trong eclipse mà không cần tất cả những điều đó.
Laplie Anderson

35

Cách giải quyết mà tôi sử dụng là chỉ sử dụng System.in/System.out thay vì Console khi sử dụng Eclipse. Ví dụ, thay vì:

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

Bạn có thể dùng:

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

20
Tôi không nghĩ rằng bạn có thể đọc mật khẩu bằng cách che mật khẩu theo cách đó.
Sualeh Fatehi

3
... và một cái cần phải xử lý IOException, cái mà không được ném trong trường hợp Console.readLine().
dma_k

5

Lý do điều này xảy ra là vì eclipse chạy ứng dụng của bạn dưới dạng quy trình nền chứ không phải quy trình cấp cao nhất với bảng điều khiển hệ thống.


5

Bạn có thể tự thực hiện một lớp. Sau đây là một ví dụ:

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

Tìm thấy điều gì đó về điều này tại http://www.stupidjavatricks.com/?p=43 .

Và thật đáng buồn, vì giao diện điều khiển là cuối cùng, bạn không thể mở rộng nó để tạo một trình bao bọc xung quanh system.in và system.out cũng làm được điều đó. Ngay cả bên trong bảng điều khiển nhật thực, bạn vẫn có quyền truy cập vào chúng. Đó có thể là lý do tại sao eclipse vẫn chưa cắm cái này vào bảng điều khiển của họ ...

Tôi hiểu tại sao bạn không muốn có bất kỳ cách nào khác để có được một bảng điều khiển khác ngoài System.console, không có trình cài đặt, nhưng tôi không hiểu tại sao bạn lại không muốn ai đó có thể ghi đè lớp để tạo bảng điều khiển mô phỏng / thử nghiệm ...


4

Một tùy chọn khác là tạo một phương thức để kết hợp cả hai tùy chọn và "fail over" phương thức System.in khi Console không khả dụng. Ví dụ dưới đây là một ví dụ khá cơ bản - bạn có thể làm theo quy trình tương tự để kết hợp các phương thức khác trong Console (readPassword, format) theo yêu cầu. Bằng cách đó, bạn có thể chạy nó một cách vui vẻ trong Eclipse và khi nó được triển khai, bạn sẽ nhận được các tính năng Console (ví dụ: ẩn mật khẩu) khởi động.

    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

Theo như tôi có thể nói, không có cách nào để lấy một đối tượng Console từ Eclipse. Tôi chỉ muốn đảm bảo rằng console! = Null, sau đó JAR nó lên và chạy nó từ dòng lệnh.


1

Dường như không có cách nào để lấy đối tượng java.io.Console khi chạy một ứng dụng thông qua Eclipse. Một cửa sổ bảng điều khiển dòng lệnh không được mở bằng ứng dụng, vì nó được chạy như một quá trình nền (nền cho Eclipse?). Hiện tại, không có plugin Eclipse nào để xử lý vấn đề này, chủ yếu là do java.io.Console là một lớp cuối cùng.

Tất cả những gì bạn thực sự có thể làm là kiểm tra đối tượng Console trả về cho giá trị null và tiếp tục từ đó.


1

Liên kết này cung cấp các lựa chọn thay thế cho việc sử dụng System.console (). Một là sử dụng BufferedReader quấn quanh System.in, thứ hai là sử dụng Scanner quấn quanh System.in.

Cả hai đều không ngắn gọn như bảng điều khiển, nhưng cả hai đều hoạt động trong nhật thực mà không cần phải sử dụng đến lỗi silliness!


0

Giả sử không gian làm việc Eclipse của bạn là C: \ MyWorkspace, bạn đã tạo ứng dụng java của mình bên trong dự án maven MyProject và lớp chính Java của bạn là com.mydomain.mypackage.MyClass.

Trong trường hợp này, bạn có thể chạy lớp chính của mình sử dụng System.console()trên dòng lệnh:

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

NB1: nếu nó không nằm trong một dự án maven, hãy kiểm tra thư mục đầu ra trong thuộc tính dự án | Đường dẫn xây dựng Java | Nguồn. Nó có thể không phải là "target / class"

NB2: nếu đó là một dự án maven, nhưng lớp của bạn nằm trong src / test / java, bạn có thể sẽ phải sử dụng "target \ test-class" thay vì "target \ class"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.