Używam środowiska Eclipse IDE do opracowywania, kompilowania i uruchamiania projektów w języku Java. Dzisiaj próbuję użyć tej java.io.Console
klasy do zarządzania danymi wyjściowymi i, co ważniejsze, danymi wejściowymi użytkownika.
Problem polega na tym, że System.console()
powraca, null
gdy aplikacja jest uruchamiana „przez” Eclipse. Eclipse uruchamia program w procesie w tle, a nie w procesie najwyższego poziomu w znanym nam oknie konsoli.
Czy istnieje sposób, aby zmusić Eclipse do uruchomienia programu jako procesu najwyższego poziomu lub przynajmniej utworzyć konsolę, którą rozpozna JVM? W przeciwnym razie jestem zmuszony zepsuć projekt i uruchomić go w środowisku wiersza poleceń zewnętrznym w stosunku do Eclipse.
System.out
iSystem.in
jako wystarczające dla mojego przypadku użycia i zrezygnowałem z używaniaSystem.console()
.Odpowiedzi:
Zakładam, że chcesz mieć możliwość debugowania krok po kroku z Eclipse. Możesz po prostu uruchamiać klasy zewnętrznie, ustawiając zbudowane klasy w katalogach bin w ścieżce klas JRE.
Możesz debugować za pomocą zdalnego debugera i korzystając z plików klas wbudowanych w projekcie.
W tym przykładzie struktura projektu Eclipse wygląda następująco:
1. Uruchom konsolę JVM w trybie debugowania
debug.bat to plik wsadowy systemu Windows, który powinien być uruchamiany zewnętrznie z konsoli cmd.exe .
W argumentach port debugowania został ustawiony na 8787 . Argument suspend = y informuje maszynę JVM, aby poczekała, aż debugger się podłączy.
2. Utwórz konfigurację uruchamiania debugowania
W Eclipse otwórz okno dialogowe Debugowanie (Uruchom> Otwórz okno dialogowe debugowania ...) i utwórz nową konfigurację zdalnej aplikacji Java z następującymi ustawieniami:
3. Debugowanie
Tak więc wszystko, co musisz zrobić za każdym razem, gdy chcesz debugować aplikację, to:
Możesz śledzić ten problem w błędzie 122429 . Możesz obejść ten problem w swojej aplikacji, używając warstwy abstrakcji, jak opisano tutaj .
źródło
pause
na końcu tego pliku wsadowego, abyś mógł zobaczyć wszelkie komunikaty o błędach, które migają przed zamknięciem.Obejście, którego używam, to po prostu użycie System.in/System.out zamiast Console podczas korzystania z Eclipse. Na przykład zamiast:
Możesz użyć:
źródło
IOException
, czego w przypadku nie wyrzucamyConsole.readLine()
.Dzieje się tak, ponieważ eclipse uruchamia aplikację jako proces w tle, a nie jako proces najwyższego poziomu z konsolą systemową.
źródło
Możesz samodzielnie wdrożyć klasę. Oto przykład:
źródło
Znalazłem coś na ten temat pod adresem http://www.stupidjavatricks.com/?p=43 .
I niestety, ponieważ konsola jest ostateczna, nie możesz jej rozszerzyć, aby utworzyć opakowanie wokół system.in i system.out, które też to robi. Nawet w konsoli Eclipse nadal masz do nich dostęp. Prawdopodobnie dlatego Eclipse nie podłączyło tego jeszcze do swojej konsoli ...
Rozumiem, dlaczego nie chciałbyś mieć innego sposobu na uzyskanie konsoli innej niż Konsola System.console, bez setera, ale nie rozumiem, dlaczego nie chciałbyś, aby ktoś mógł zastąpić klasę, aby utworzyć makieta / konsola testowa ...
źródło
Inną opcją jest utworzenie metody umożliwiającej zawinięcie obu opcji i „przełączenie awaryjne” na metodę System.in, gdy konsola nie jest dostępna. Poniższy przykład jest dość podstawowy - możesz wykonać ten sam proces, aby zawrzeć inne metody w konsoli (readPassword, format) zgodnie z wymaganiami. W ten sposób możesz go szczęśliwie uruchomić w Eclipse, a po jego wdrożeniu pojawią się funkcje konsoli (np. Ukrywanie hasła).
źródło
O ile wiem, nie ma sposobu na uzyskanie obiektu Console z Eclipse. Po prostu upewniłbym się, że konsola! = Null, a następnie JAR ją i uruchomię z wiersza poleceń.
źródło
Wydaje się, że nie ma możliwości uzyskania obiektu java.io.Console podczas uruchamiania aplikacji za pośrednictwem Eclipse. Okno konsoli wiersza poleceń nie jest otwierane z aplikacją, ponieważ jest ona uruchamiana jako proces w tle (tło do Eclipse?). Obecnie nie ma wtyczki Eclipse do obsługi tego problemu, głównie ze względu na fakt, że java.io.Console jest ostatnią klasą.
Wszystko, co naprawdę możesz zrobić, to przetestować zwrócony obiekt Console pod kątem wartości null i przejść dalej.
źródło
Ten link oferuje alternatywy dla korzystania z System.console (). Jednym z nich jest użycie BufferedReader owiniętego wokół System.in, a drugim jest użycie skanera owiniętego wokół System.in.
Żadne z nich nie są tak zwięzłe jak konsola, ale oba działają w zaćmieniu bez konieczności uciekania się do debugowania głupoty!
źródło
Załóżmy, że Twój obszar roboczy Eclipse to C: \ MyWorkspace, aplikacja Java została utworzona w projekcie maven MyProject, a Twoja główna klasa Java to com.mydomain.mypackage.MyClass.
W takim przypadku możesz uruchomić swoją główną klasę, która używa
System.console()
w linii poleceń:NB1: jeśli nie jest w projekcie maven, sprawdź folder wyjściowy we właściwościach projektu | Ścieżka budowania Java | Źródło. To może nie być „cel / klasy”
NB2: jeśli jest to projekt maven, ale twoja klasa znajduje się w src / test / java, prawdopodobnie będziesz musiał użyć „target \ test-classes” zamiast „target \ classes”
źródło