Eclipse IDE'de java.io.Console desteği


103

Java projelerimi geliştirmek, derlemek ve çalıştırmak için Eclipse IDE'yi kullanıyorum. Bugün, java.io.Consoleçıktıyı ve daha da önemlisi kullanıcı girdisini yönetmek için sınıfı kullanmaya çalışıyorum .

Sorun, bir uygulama Eclipse "üzerinden" çalıştırıldığında System.console()geri nulldönmesidir. Eclipse, programı aşina olduğumuz konsol penceresiyle üst düzey bir işlem yerine arka planda çalıştırır.

Eclipse'i programı üst düzey bir işlem olarak çalıştırmaya veya en azından JVM'nin tanıyacağı bir Konsol oluşturmaya zorlamanın bir yolu var mı? Aksi takdirde, projeyi sarsmak ve Eclipse dışındaki bir komut satırı ortamında çalıştırmak zorunda kalırım.


Ayrıca bkz stackoverflow.com/questions/26470972/... ben tespit System.outve System.inbenim kullanım örneği için yeterli ve kullanma abondaned için System.console().
OneWorld

Projeyi çalıştırılabilir kavanoz olarak dışa
aktardım

Yanıtlar:


50

Eclipse'den adım adım hata ayıklamayı kullanmak isteyebileceğinizi varsayıyorum. JRE sınıf yolundaki bin dizinlerinde yerleşik sınıfları ayarlayarak sınıfları harici olarak çalıştırabilirsiniz.

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

Uzaktan hata ayıklayıcıyı kullanarak ve projenizde yerleşik olan sınıf dosyalarından yararlanarak hata ayıklayabilirsiniz.

Bu örnekte, Eclipse proje yapısı şuna benzer:

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

1. JVM Konsolunu Hata Ayıklama Modunda başlatın

debug.bat , bir cmd.exe konsolundan harici olarak çalıştırılması gereken bir Windows toplu iş dosyasıdır .

@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

Bağımsız değişkenlerde, hata ayıklama bağlantı noktası 8787 olarak ayarlanmıştır . Askıya = y argüman ayıklayıcı Ataşeleri'nden kadar beklemek JVM söyler.

2. Bir Hata Ayıklama Başlatma Yapılandırması Oluşturun

Eclipse'de, Hata Ayıklama iletişim kutusunu açın (Çalıştır> Hata Ayıklama İletişim Kutusunu Aç ...) ve aşağıdaki ayarlarla yeni bir Uzak Java Uygulaması yapılandırması oluşturun:

  • Proje: proje adınız
  • Bağlantı Tipi: Standart (Soket Bağlantısı)
  • Ana bilgisayar: localhost
  • Bağlantı noktası : 8787

3. Hata Ayıklama

Yani, uygulamada hata ayıklamak istediğiniz her zaman yapmanız gereken tek şey şudur:

  • kırılma noktası ayarla
  • toplu iş dosyasını bir konsolda başlatın
  • hata ayıklama yapılandırmasını başlat

Bu sorunu 122429 numaralı hatadan takip edebilirsiniz . Burada açıklandığı gibi bir soyutlama katmanı kullanarak uygulamanızda bu sorunu çözebilirsiniz .


1
Ayrıca pausebu toplu iş dosyasının sonuna bir de koyardım , böylece kapanmadan önce yanıp sönen hata mesajlarını görebilirsiniz.
Matt Lyons

10
Bu benim için bardağı taşıran son damla. Bunların hepsini hata ayıklamak için yapmam gerekirse, Netbeans'e geri dönüyorum. Eclipse'de pek çok düzeltilmemiş hata ve kullanıcı arayüzü sıkıntısı komik bile değil.
nuzzolilo

@Nuzzolilo, bu sadece uzaktan hata ayıklama içindir. Bunların hepsi olmadan tutulmada yerel olarak hata ayıklayabilirsiniz.
Laplie Anderson

35

Kullandığım geçici çözüm, Eclipse kullanırken yalnızca Console yerine System.in/System.out kullanmaktır. Örneğin, bunun yerine:

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

Kullanabilirsiniz:

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

20
Bu şekilde şifre maskeleme ile şifreleri okuyabileceğinizi sanmıyorum.
Sualeh Fatehi

3
... ve IOExceptionolması durumunda atılmayan birinin ele alınması gerekir Console.readLine().
dma_k

5

Bunun olmasının nedeni, eclipse'in uygulamanızı bir sistem konsoluyla üst düzey bir işlem olarak değil, bir arka plan işlemi olarak çalıştırmasıdır.


5

Bir sınıfı kendiniz uygulayabilirsiniz. Aşağıda bir örnek verilmiştir:

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 adresinde bununla ilgili bir şey buldum .

Ve ne yazık ki, konsol nihai olduğundan, onu system.in ve system.out etrafında bir sarmalayıcı oluşturacak şekilde genişletemezsiniz, bu da bunu yapar. Tutulma konsolunun içinde bile bunlara hala erişebilirsiniz. Eclipse'in bunu henüz konsollarına takmamasının nedeni muhtemelen bu ...

System.console dışında ayarlayıcı olmadan başka bir konsol edinmenin neden başka bir yolunu istemediğini anlıyorum, ama neden birinin sınıfı geçersiz kılarak yapmasını istemediğini anlamıyorum. taklit / test konsolu ...


4

Diğer bir seçenek, her iki seçeneği de sarmak için bir yöntem oluşturmak ve Konsol kullanılamadığında System.in yöntemine "yük devretmektir". Aşağıdaki örnek oldukça basit bir örnektir - Konsol'daki diğer yöntemleri (readPassword, format) gerektiği gibi tamamlamak için aynı işlemi uygulayabilirsiniz. Bu şekilde, Eclipse'de mutlu bir şekilde çalıştırabilirsiniz ve dağıtıldığında, Konsol özelliklerini (örneğin parola gizleme) devreye alırsınız.

    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

Anladığım kadarıyla Eclipse'den bir Console nesnesi almanın bir yolu yok. Sadece o konsolun! = Null olduğundan emin olurdum, sonra JAR ile komut satırından çalıştırırdım.


1

Eclipse aracılığıyla bir uygulama çalıştırırken java.io.Console nesnesi almanın bir yolu yok gibi görünüyor. Bir arka plan işlemi (Eclipse için arka plan) olarak çalıştırıldığı için uygulamayla birlikte bir komut satırı konsolu penceresi açılmaz. Şu anda, esas olarak java.io.Console'un son sınıf olması nedeniyle bu sorunu ele alacak bir Eclipse eklentisi yoktur.

Gerçekten yapabileceğiniz tek şey, döndürülen Console nesnesinin boş olup olmadığını test etmek ve oradan devam etmektir.


1

Bu bağlantı , System.console () kullanmaya alternatifler sunar. Birincisi, System.in etrafına sarılmış bir BufferedReader kullanmak, ikincisi ise System.in etrafına sarılmış bir Tarayıcı kullanmaktır.

İkisi de konsol kadar kısa değil, ama ikisi de tutulması saçmalığına başvurmak zorunda kalmadan tutuluyor!


0

Eclipse çalışma alanınızın C: \ MyWorkspace olduğunu, java uygulamanızı bir maven projesi MyProject içinde oluşturduğunuzu ve Java ana sınıfınızın com.mydomain.mypackage.MyClass olduğunu varsayalım.

Bu durumda, System.console()komut satırında kullanan ana sınıfınızı çalıştırabilirsiniz :

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

Not1: bir maven projesinde değilse, proje özelliklerinde çıktı klasörünü kontrol edin | Java Derleme Yolu | Kaynak. "Hedef / sınıflar" olmayabilir

NB2: bu bir maven projesiyse, ancak sınıfınız src / test / java içindeyse, muhtemelen "target \ classes" yerine "target \ test-classes" kullanmanız gerekecek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.