JavaFX Anwendung beendet sich selbst nur als Jar

PG_97

Aktives Mitglied
Situation:
Wie oben geschrieben beendet sich unsere Anwendung von selbst und wir haben keine Ahnung warum.
Wenn man das Programm aus IntelliJ auf Windoof/Linux startet ist alles in Ordnung.
Zudem bekommen wir keine Fehlermeldung!

Frage:
Habt ihr Ideen, welche das Problem lösen könnten?
 
Situation:
Wie oben geschrieben beendet sich unsere Anwendung von selbst und wir haben keine Ahnung warum.
Wenn man das Programm aus IntelliJ auf Windoof/Linux startet ist alles in Ordnung.
Zudem bekommen wir keine Fehlermeldung!

Frage:
Habt ihr Ideen, welche das Problem lösen könnten?
Was gibt die Console aus wenn du unter Windows ausführst?
 
Es wird nichts ausgegeben und wir sind offenbar mit dem Problem alleine auf der Welt, im Internet steht nichts darüber.

Maven Packages sind alle auch korrekt installiert.
 
Code:
package com.abc.receiptvalidator;

import com.abc.receiptvalidator.controllers.MainController;
import com.abc.receiptvalidator.database.ConnectionManager;
import com.abc.receiptvalidator.navigation.Frames;
import com.abc.receiptvalidator.navigation.NavigationService;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * Main App class
 *
 * @author ...
 */
public class App extends Application {

    /**
     * Run method called from external Launcher class.
     * This is needed because of how JavaFX works nowdays :)
     */
    public static void run(String[] args) {
        launch(args);
    }

    public static Image ICON;
    public static String VERSION;

    @Override
    public void init() throws Exception {
        super.init();
        loadVersion();
        loadIcon();
    }

    @Override
    public void stop() throws Exception {
        ConnectionManager.getInstance().disconnect();
        super.stop();
    }

    @Override
    public void start(Stage stage) throws Exception {
        NavigationService.getInstance().show(Frames.MAIN_FRAME);
    }

    private void loadIcon() {
        ICON = new Image(App.class.getResourceAsStream("/img/logo_abc_128.png"));
    }

    private void loadVersion() {
        try {
            MavenXpp3Reader reader = new MavenXpp3Reader();
            Model model;
            if ((new File("pom.xml")).exists())
                model = reader.read(new FileReader("pom.xml"));
            else
                model = reader.read(getClass().getResourceAsStream("/META-INF/maven/com.abc/receipt-validator/pom.xml"));
            VERSION = model.getVersion();
        } catch (IOException | XmlPullParserException e) {
            VERSION = "";
        }
    }
}

und

Code:
package com.abc.receiptvalidator;

public class Launcher {

    public static void main(String[] args) {
        App.run(args);
    }
}
 
Java:
} catch (IOException | XmlPullParserException e) {
    VERSION = "";
}
Wenn ich so etwas sehe, wundere ich mich nicht, dass du keine Fehlermeldung bekommst.
 
Kann es sein, dass Maven beim Zusammenbauen von JavaFX es nicht schafft alles zusammen zu führen?
Es ist ja so, dass das Programm in IntelliJ und Co. funktioniert!
 
Wenn wir das Programm starten läuft es durch die Startmethode durch, gibt die Ausgaben an und beendet sich wieder.
Es schafft es allerdings nicht über die Startmethode hinaus zu gehen bzw. das Programm müsste sich erst beenden, wenn die letzte Stage durchgelaufen ist.
 
Dann liegt der Fehler wohl in NavigationService.getInstance().show(Frames.MAIN_FRAME);

Also das gleiche dort machen
 
Code:
private Stage getStage(String frame) {
        FXMLLoader loader = new FXMLLoader(getClass().getResource(frame));
        Stage stage = null;
        try {
            stage = loader.load();
        } catch (IOException e) {
            return null;
        }
        Object controller = loader.getController();
        if (controller instanceof BaseController) {
            ((BaseController) controller).setStage(stage);
        } else {
            throw new RuntimeException("Controller if frame" + frame + " doesn't extend BaseController");
        }
        return stage;
    }

    public void show(String frame) {
        Stage stage = getStage(frame);
        if (stage != null) {
            stage.show();
        }
    }

Also in der Klasse gibt es auch eine Konsolenausgabe.
 
FXMLLoader loader = new FXMLLoader(getClass().getResource(frame));
Stage stage = null;
try {
stage = loader.load();
} catch (IOException e) {
return null;
}

Auch hier wieder, warum druckt man da nicht den StackTrace oder logged an der Stelle ein Error, anstatt das zu ignorieren?
 
Okay, d.h. wenn da ein Exception geworfen werden soll gibt der null zurück, also die Folge daraus stage == null, nichts anzeigen.
 
Nee, das null haben wir ausgetauscht und sagen Ihm, dass er etwas ausgeben soll, was aber nicht passiert 🙂
Und die Stage ist nicht null und sie werden für ein paar Millisekunden nicht angezeigt!
 
Also die Anwendung startet unter Linux korrekt, aber unter Windows nicht?

Wie sind die Dependencies in der Pom eingetragen? Auf welchem System wird gebaut?
 

Zurück
Oben