it-swarm-tr.com

eclipse'da java.io.Console desteği IDE

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

Sorun şu ki, bir uygulama "ile" Eclipse çalıştırıldığında System.console(), null değerini döndürür. Eclipse, aşina olduğumuz konsol penceresiyle üst düzey bir işlem yerine programı bir arka plan işleminde çalıştırır.

Eclipse'i programı en üst seviye bir işlem olarak çalıştırmaya zorlamak ya da en azından JVM'nin tanıyacağı bir Konsol oluşturmak için bir yol var mı? Aksi takdirde, projeyi kapatmaya ve Eclipse dışındaki bir komut satırı ortamında çalıştırmaya zorlanırım.

102
Ross

Eclipse'dan adım adım hata ayıklama özelliğini kullanmak istediğinizi varsayalım. Sınıfları, JRE sınıfyolundaki bin dizinlerinde yerleşik sınıfları ayarlayarak 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 sınıf dosyalarından yararlanarak hata ayıklayabilirsiniz.

Bu örnekte, Eclipse proje yapısı şöyle görünür:

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

1. JVM Konsolunu Debug Modunda Başlat

debug.bat, harici olarak bir cmd.exe konsolundan ç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 ayarlandı. Suspend = y argümanı JVM'ye hata ayıklayıcının eklenene kadar beklemesini söyler.

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

Eclipse'de, Hata Ayıkla 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ı Türü: Standart (Soket Takma)
  • Ana bilgisayar: localhost
  • Port: 8787

3. Hata ayıklama

Yani, uygulama hata ayıklamak istediğiniz herhangi bir zaman yapmanız gereken tek şey:

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

Bu sorunu bug 122429 içinde takip edebilirsiniz. Bu konuda, uygulamanızda here 'de açıklanan soyutlama katmanını kullanarak çalışabilirsiniz.

50
McDowell

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

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

Kullanabilirsiniz:

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

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

5
Heath Borders

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

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

Bununla ilgili bir şey buldum http://www.stupidjavatricks.com/?p=43 .

Ve ne yazık ki, konsol son olduğundan, bunu yapan system.in ve system.out etrafında bir sarmalayıcı oluşturmak için genişletemezsiniz. Eclipse konsolunda bile bunlara erişebiliyorsunuz. Muhtemelen Eclipse bunu henüz konsollarına takmamış olabilir.

Neden bir ayarlayıcı olmadan System.console'den başka bir konsol almak istemediğini anlayamıyorum, ama neden birisinin sınıf yapmak için dersi geçersiz kılmak istemeyeceğini anlamıyorum. alay/test konsolu ... 

4
John Gardner

Diğer bir seçenek, her iki seçeneği de kapatacak bir yöntem oluşturmak ve Konsol kullanılamadığında System.in yöntemine "başarısız" dır. Aşağıdaki örnek oldukça basit bir örnek - Konsoldaki diğer yöntemleri (readPassword, format) gerektiği gibi kaydırmak için aynı işlemi uygulayabilirsiniz. Bu şekilde Eclipse'de mutlu bir şekilde çalıştırabilirsiniz ve konuşlandırıldığında Konsol özelliklerini (örneğin parola gizleme) devreye girmesini sağlayabilirsiniz.

    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;
    }
4
binarycube

Söyleyebileceğim kadarıyla, Eclipse'den bir Konsol nesnesi almanın bir yolu yoktur. Konsolun! = Null olduğundan emin olduktan sonra JAR ile çalıştır ve komut satırından çalıştır.

2
perimosocordiae

Eclipse üzerinden bir uygulama çalıştırırken Java.io.Console nesnesini almanın bir yolu yok gibi görünüyor. Bir komut satırı konsolu penceresi, uygulamada arka plan işlemi olarak çalıştırıldığı için açılmaz (arkaplan Eclipse?). Şu anda, çoğunlukla Java.io.Console'un son bir sınıf olması nedeniyle bu sorunu çözen Eclipse eklentisi yok.

Gerçekten yapabileceğiniz tek şey döndürülen Konsol nesnesini null değerine sınamak ve oradan devam etmektir.

1
Ross

Bu link , System.console () 'nin kullanımına 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. 

Her ikisi de konsol kadar özlü değil, ama ikisi de Eclipse'de aptallığın hatalarını ayıklamak zorunda kalmadan çalışıyor!

1
DaveRlz

Eclipse çalışma alanınızın C:\MyWorkspace, .__ olduğunu diyelim. Java uygulamanızı bir maven projesi olan MyProject, İçinde oluşturdunuz ve Java ana sınıfınız com.mydomain.mypackage.MyClass.

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

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

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

Not: bir maven projesiyse, ancak sınıfınız src/test/Java ise, muhtemelen "target\classes" yerine "target\test-classes" kullanmanız gerekir.

0
Paulo Merson