Konsolenausgaben trotz javaw

miffi

Erfahrenes Mitglied
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:
  1. Die Outstreams irgendwie trotz javaw auf die Konsole umleiten
  2. 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
 
Huhu,

Bei javaw wird zwar keine Konsole angezeigt, wird aber nicht dennoch auf STDOUT und STDERR geschrieben, was auch ausgelesen werden kann?!
 
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 :)
 
Zuletzt bearbeitet:
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
 
Warum muss es denn in der Konsole dargestellt werden? Du könntest es doch immer in der GUI anzeigen lassen.

Gruß

Sascha
 
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
 
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.
Java:
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ß
 
Zuletzt bearbeitet:
Zurück