# Konsolenausgaben trotz javaw



## miffi (22. Juni 2010)

Hi zusammen.

Folgende Problemstellung:
Ich habe ein Tool geschrieben, das standardmäßig (per Doppelklick auf die exe/jar) über _javaw_ das GUI startet, ohne eine Konsole zu öffnen. Das sollte sich auch nicht ändern, also fällt bei folgendem Problem eine Umstellung auf einen Aufruf über _java -jar_ weg. 
Und zwar musste ich eine Erweiterung entwickeln, die es ermöglicht, bestimmte Operationen über Parameter durchzuführen, ohne das GUI zu starten. Dies dient der Massenabfertigung, beispielsweise für Batch-Files. Hierbei bekomme ich natürlich keinen Output mehr auf die Konsole, was aber für Fehlerausgaben bzw. Manuals nötig wäre.

Nun habe ich zwei Möglichkeiten:

 Die Outstreams irgendwie trotz _javaw_ auf die Konsole umleiten
 Beim Start unterscheiden, ob es sich um einen Konsolen-Aufruf handelt oder aus dem Explorer heraus.
Weiß jemand eine Lösung hierzu? Ich wäre sehr dankbar!

Natürlich hab ich das Java-Forum schon bezüglich dieses Themas durchsucht, bin dabei allerdings lediglich auf Anfänger-Fragen gestoßen, die den Unterschied zwischen _java_ und _javaw_ noch nicht kannten. Standard-Lösungen wie ein Aufruf über Batch-Files usw. fallen weg, da ich die Software über einen exe-Wrapper aufrufen muss.

Grüße
miffi


----------



## mccae (22. Juni 2010)

Huhu,

Bei javaw wird zwar keine Konsole angezeigt, wird aber nicht dennoch auf STDOUT und STDERR geschrieben, was auch ausgelesen werden kann?!


----------



## miffi (22. Juni 2010)

Hi mccae, danke schon mal für die schnelle Antwort.

Diese beiden Streams habe ich ursprünglich (bei einem Aufruf über _java -jar blubb.jar_) ausgegeben. Jedoch werden sie geschluckt, wenn man über _javaw_ aufruft....
Ich hätte auch gedacht, dass man den Standard-Output auf jeden Fall darstellen kann.

Bis hier eventuell jemand eine Lösung für mich hat, schreib ich mir grad einen Starter, der je nach Anzahl der Parameter das Haupt-Programm entweder über java oder javaw aufruft.

Gruß
miffi

/////////// edit:
Okay, das mit dem Starter ist auch Blödsinn... Ist das gleiche Problem. Um die Ausgaben hier zu bekommen, müsste ich auch über _java_ starten, was heißt, dass hier ebenfalls die ganze Zeit ein Fenster offen bleibt.
Naju, vielleicht weiß ja einer von euch noch was


----------



## zerix (23. Juni 2010)

Hallo,

was du da machen könntest wäre halt, dass du dir die Konstolenausgaben in eine Textarea umleitest und sie dort anzeigst. 

Schau mal hier
http://www.tutorials.de/forum/java-...gabe-umleiten-auf-textarea-2.html#post1626034

Gruß

Sascha


----------



## miffi (23. Juni 2010)

Hallo Sascha,

den Stream umzuleiten wäre nicht das Problem, das habe ich dann und wann schon getan.
Die Sachlage ist aber leider die, dass ich Rückgaben des Programmes _entweder_ in dem GUI _oder_ in der Konsole darstellen muss. D.h. den Stream in ein GUI-Element umzuleiten, wenn keines geladen wird, ist weniger sinnvoll.

Inzwischen glaube ich, dass das Problem nicht lösbar ist. Über Batches wäre das alles kein Problem, aber wegen des Exe-Wrappers muss ich mich zwischen _java_ und _javaw_ entscheiden.
Falls doch noch jemand eine Lösung weiß, bitte immer her damit. Es wird vermutlich auf zwei Exe's rauslaufen. Den Thread lass ich mal noch offen, wenn es okay ist.
Und danke an mccae und Sasche für die bisherigen Ideen!

Gruß
miffi


----------



## zerix (23. Juni 2010)

Warum muss es denn in der Konsole dargestellt werden? Du könntest es doch immer in der GUI anzeigen lassen.

Gruß

Sascha


----------



## deepthroat (23. Juni 2010)

Hi.

Du könntest dir auch noch nachträglich eine Konsole allozieren. Dazu müßtest du die Win API Funktion AllocConsole verwenden. Das könntest du über JNI oder auch über JNA (https://jna.dev.java.net/) bewerkstelligen.

Gruß


----------



## zerix (23. Juni 2010)

> Hi.
> 
> Du könntest dir auch noch nachträglich eine Konsole allozieren. Dazu müßtest du die Win API Funktion AllocConsole verwenden. Das könntest du über JNI oder auch über JNA (https://jna.dev.java.net/) bewerkstelligen.
> 
> Gruß



Mit der WinApi kenne ich mich leider nicht aus. Wie schafft er es denn die Ausgaben, die von der java.exe auf die Konsole zu bringen, wenn das Programm mit javaw.exe gestartet wurde?

Gruß

Sascha


----------



## deepthroat (23. Juni 2010)

zerix hat gesagt.:


> Mit der WinApi kenne ich mich leider nicht aus. Wie schafft er es denn die Ausgaben, die von der java.exe auf die Konsole zu bringen, wenn das Programm mit javaw.exe gestartet wurde?


Das passiert automatisch. Java verwendet intern auch nur die Standard Konsole Handles (die bei einer Windows Anwendung wie javaw nicht belegt sind). Alloziert man eine neue Konsole werden die Standard-Handles belegt und voilà... 

\edit: Ich habe es gerade mal ausprobiert. Die gute Nachricht ist: startet man die Applikation mit javaw von der Konsole aus, wird ein neues Konsolenfenster geöffnet und die Ausgabe findet dort statt. Allerdings klappt das nicht mehr wenn man die Anwendung mit einem Doppelklick aus dem Explorer startet: es wird zwar eine Konsole geöffnet, aber es wird nichts ausgegeben. (das liegt vermutlich daran, das javaw die Ein-/Ausgabestream nicht initialisiert... ?)

\edit: Andersherum könnte man natürlich immer java.exe verwenden und die Konsole mit FreeConsole verschwinden lassen.

*Update*: Hier mal ein komplettes Beispielprogramm. Es wird eine Konsole erzeugt falls der aktuelle Prozess noch keine besitzt.

```
package de.tutorials.samples;

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * Hello world!
 *
 */
public class App {

    public interface Kernel32 extends StdCallLibrary {
        Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

        boolean AllocConsole();
    }

    public static void main(String[] args) throws InterruptedException, FileNotFoundException {
        if (System.console() == null) {
            Kernel32.INSTANCE.AllocConsole();

            PrintStream out = new PrintStream(new FileOutputStream("CONOUT$"));
            System.setOut(out);
            System.setErr(out);
        }
        System.out.println("Hello World!");

        Thread.sleep(5000);
    }
}
```

Gruß


----------



## zerix (23. Juni 2010)

deepthroat hat gesagt.:


> Das passiert automatisch. Java verwendet intern auch nur die Standard Konsole Handles (die bei einer Windows Anwendung wie javaw nicht belegt sind). Alloziert man eine neue Konsole werden die Standard-Handles belegt und voilà...



Ok, dass das automatisch passiert wusste ich nicht. ;-)

Gruß

Sascha


----------



## deepthroat (23. Juni 2010)

zerix hat gesagt.:


> Ok, dass das automatisch passiert wusste ich nicht. ;-)


Tja, also ganz so automatisch funktioniert es wohl nicht... :-(

Aber grundsätzlich ist es möglich... 

Gruß


----------



## miffi (23. Juni 2010)

Das wäre natürlich eine Möglichkeit, ja. Die Frage ist, ob der Aufwand gerechtfertigt ist.
Vor allem sollte ich in diesem Projekt die Einbindung nativer Bibliotheken bzw. Zugriffe vermeiden.

Danke euch auf jeden Fall für die Diskussion!

Gruß
miffi


----------



## deepthroat (23. Juni 2010)

miffi hat gesagt.:


> Das wäre natürlich eine Möglichkeit, ja. Die Frage ist, ob der Aufwand gerechtfertigt ist.
> Vor allem sollte ich in diesem Projekt die Einbindung nativer Bibliotheken bzw. Zugriffe vermeiden.


Naja, also die kernel32.dll wird sowieso eingebunden, da kannst du nichts gegen machen... 

Gruß


----------

