JavaFX-Programme nur in NetBeans selber ausführbar ! command_line: NoClassDefFoundError

volcanos

Bekanntes Mitglied
Die NICHT-JavaFX-Programme kann man aber schon in der command_line ausführen, entweder mit:

java NormalesTestMain

oder:

java -cp /tux/netbeans/tux/netBeansProjects/Test/target/classes at.cube.test.NormalesTestMain


In der command_line ist vorher ClassNotFoundException gekommen...

mit bei der Klassen-Ausführung:
java EinnahmenMain
java at.cube.einnahmen.EinnahmenMain
java einnahmen.EinnahmenMain
java -cp /tux/netbeans/tux/netBeansProjects/Einnahmen/target/classes at.cube.einnahmen.EinnahmenMain

sowohl auch bei der jar-Ausführung mit:
java -jar Einnahmen.jar



danach die Änderung der MANIFEST.MF von

Main-Class: at.cube.einnahmen.EinnahmenMain

auf

Package: at.cube.einnahmen
Main-Class: EinnahmenMain

Jetzt kommt der NoClassDefFoundError (im Unterschied zu ClassNotFoundException !)


Überall und Immer bei JafaFX-Programmen (außer in NetBeans selber !!!)


Meine META-INF/MANIFEST.MF sieht jetzt so aus:

Manifest-Version: 1.0
Build-Jdk-Spec: 18
Package: at.cube.einnahmen
Main-Class: EinnahmenMain



Normalerweise sieht sie aber so aus !?

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.8
Created-By: 17+35-2724 (Oracle Corporation)
Class-Path: lib/cutils.jar lib/gson-2.8.5.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: at.cube.einnahmen.EinnahmenMain



Das jar-File habe ich mit

jar cmvf META-INF/MANIFEST.MF Einnahmen.jar *

erstellt.


Bei meiner MANIFEST.MF fehlt der lib classpath !
Welche lib ?




set | grep PATH

PATH=/usr/lib/jvm/jdk-18/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/javafx-sdk-18.0.2/bin

set | grep CLASSPATH
CLASSPATH=.:/usr/share/java/mysql-connector-java.jar

set | grep JAVA_HOME
JAVA_HOME=/usr/lib/jvm/jdk-18

set | grep JAVAFX_HOME
JAVAFX_HOME=/usr/lib/jvm/javafx-sdk-18.0.2


pom.xml:



Code:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>at.cube</groupId>
    <artifactId>Einnahmen</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!-- MySQL-Connector Configuration: Beginn: -->           
        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
        <exclusions>
        <exclusion>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        </exclusion>
        </exclusions>
        </dependency>
        <!-- MySQL-Connector Configuration: Ende: -->         
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <mainClass>at.cube.einnahmen.EinnahmenMain</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                    </execution>
                    <execution>
                        <!-- Configuration for manual attach debugging -->
                        <!-- Usage: mvn clean javafx:run@debug -->
                        <id>debug</id>
                        <configuration>
                            <options>
                                <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
                            </options>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- Configuration for automatic IDE debugging -->
                        <id>ide-debug</id>
                        <configuration>
                            <options>
                                <option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
                            </options>
                        </configuration>
                    </execution>
                    <execution>
                        <!-- Configuration for automatic IDE profiling -->
                        <id>ide-profile</id>
                        <configuration>
                            <options>
                <option>${profiler.jvmargs.arg1}</option>
                <option>${profiler.jvmargs.arg2}</option>
                <option>${profiler.jvmargs.arg3}</option>
                <option>${profiler.jvmargs.arg4}</option>
                <option>${profiler.jvmargs.arg5}</option>
                            </options>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>


Wie gesagt, bei Netbeans funktioniert alles: der Datenbank-Zugriff auf MySQl und auch JavaFX.
Hier ist die Konfuguration im /opt/netbeans-Verz. bzw. teilweise für javafx auch im /opt/scenebuilder-Verz. !?
Aber das Ganze, was NetBeans betrifft, ist so ziemlich unübersichtlich und fehlerhaft.

Nur 1 Beispiel:
die META-INF/MANIFEST.MF kommen bei NetBeans in den Projekt-Verz. NIE vor !!!
Man muss wissen, dass man diese selber erstellen muss !

Und eclipse ?
Das funktioniert JavaFX gar nicht - bei mir !
 

KonradN

Super-Moderator
Mitarbeiter
Wenn du das JavaFX Plugin nutzt, dann baust Du ein Image mit
mvnw javafx:jlink

mvnw ist der Maven Wrappen, den musst Du natürlich dazu nehmen oder Du packst Maven in Deinen Pfad und nutzt mvn statt mvnw.

Ich bin von diesem JavaFX Plugin weg, denn es gibt Probleme, sobald Du Abhängigkeiten hast, die keine Modulbeschreibung mitliefern. Da wird es dann notwendig, da eine Modulbeschreibung unter zu schieben, was z.B. mit Moditect gehen kann.

Wie so ein JavaFX Maven Projekt aussehen kann, findest Du z.B. unter https://github.com/kneitzel/JavaFXMavenApp

Das mag zwar erst Mal wir Overkill aussehen, denn da sind halt auch so Dinge drin wie statische Codeanalyse mit PMD und Spotbugs, Suche nach aktualisierten Abhängigkeiten u.s.w.

Wenn Du den Maven Wrapper hinzufügen willst bei Dir, dann kannst Du da auch einfach die mvnw* Scripte sowie das Verzeichnis .mvn in Dein Projektverzeichnis kopieren.
 

volcanos

Bekanntes Mitglied
Das mit JavaFX ist sowieso - meiner Meinung nach - ein Pfusch.
Einerseits war die Bibliothek JavaFX ursprünglich dazu gedacht die Bibliothek Swing zu ersetzen...
Und dann ist JavaFX nicht mal bei der Java-SDK von Oracle dabei !

Um das Ganze dann noch verwirrender zu machen gibt es dann noch die verschiedenen "Java Build Tools" wie Maven, Gradle oder Ant ...
 

KonradN

Super-Moderator
Mitarbeiter
Das mit JavaFX ist sowieso - meiner Meinung nach - ein Pfusch.
Einerseits war die Bibliothek JavaFX ursprünglich dazu gedacht die Bibliothek Swing zu ersetzen...
Und dann ist JavaFX nicht mal bei der Java-SDK von Oracle dabei !

Um das Ganze dann noch verwirrender zu machen gibt es dann noch die verschiedenen "Java Build Tools" wie Maven, Gradle oder Ant ...
Also da sehe ich erst einmal keinen Pfusch. Das JDK soll halt nur die Grundlage bilden und darauf bauen dann diverse Libraries und Frameworks auf.

Das hat gewisse Vorteile weshalb man dies auch bei anderen Lösungen so findet. Im .Net Umfeld wurde auch einiges, das ist .Net 3.5 fester Bestandteil war, nach und nach ausgegliedert in die nuget Packages (nuget ist ähnlich wie der Dependency Anteil bei Maven).

Und gegen die Vielfalt würde ich mich nicht stellen. Das ist eher von Vorteil, denn man kann sich das heraus suchen, was einem am Besten gefällt.

Ich kann verstehen, dass das gerade am Anfang recht verwirrend sein kann. Da kann man viele Details auch einfach erst einmal übergehen (Mut zur Lücke) um das dann später erst zu erarbeiten. Aber in der Software Entwicklung hat man nun einmal inzwischen eine sehr hohe Komplexität - das muss sich dann ja auch irgendwo zeigen.

Aber das ist einfach meine Sicht - das muss man nicht zwingend vertiefen.
 

Neumi5694

Top Contributor
Kleiner Tip zur Fehlersuche bei solchen Problemen: Die Umgebungsvariablen deines Systems haben jetzt nicht viel mit der tatsächlichen Ausführung zu tun. Variablen wie JAVA_HOME oder JAVAFX_HOME müssen explizit von deinem Launch-Script verwendet werden, damit sie irgendwas bewirken. Java läuft grundsätzlich ohne irgendwelche gesetzten Umgebungsvariablen (bis auf die automatisch gesetzten wie userprofile oder temp).

Dass sich FX nicht durchgesetzt hat ... naja, ist halt so. Die verschiedenen Build Tools hingegen sind ein klarer Vorteil. Alle haben ihre Anwendungsgebiete und eigenen Stärken. Das Schlimmste, was dir im Softwarebereich passieren kann, ist, wenn es nur einen Kurs gibt, dem es zu folgen gilt.
Dass es nicht ein massives großes Paket gibt mit allem drin, ist auf die Natur von Java zurückzuführen. Es ist dafür gedacht, auf Geräten jeder Größe zu laufen, vom Server über PCs bis hin zur Kaffeemaschine. Eine Kaffeemaschine braucht kein JavaFX oder Enterprise Funktionen, das dort mit durchzuschleifen wäre eine gewaltige Verschwendung von Kosten.
 

KonradN

Super-Moderator
Mitarbeiter
Das Launch-Script. Ist das bei Netbeans die pom.xml oder die module-info.java oder die META-INF/MANIFEST.MF ?
Alles nicht. Beim Launch Script ist die Frage, wie das Programm gestartet wird. Das wäre also sowas wie die Run Configuration (ich weiss nicht, wie das bei Netbeans heisst).

Was mir gerade durch den Kopf geht: Kannst Du das ggf. als eine Art minimales Beispiel bereit stellen? Also z.B. das Projekt kopieren und dann alles mögliche, was nichts zum Problem beiträgt, löschen um uns dann dieses zum Nachvollziehen des Problems an die Hand zu geben.
 

volcanos

Bekanntes Mitglied
Ich kann das Projekt posten. Das mit dem Löschen, was nicht zum Problem beiträgt ist schwieriger, weil man nicht unbedingt weiß, was beiträgt und was nicht. Ich denke nicht dass es beim Programm liegt, weil es ja bei allen JavaFX-Programmen auftritt und bei den anderen nicht mit:

java -cp /tux/netbeans/tux/netBeansProjects/TestProgramm/target/classes at.cube.testprogrammeinnahmen.TestMain
 

volcanos

Bekanntes Mitglied
Main-Programm -> EinnahmenMain

Java:
/**
 * JavaFX App
 *
 * Author wolcanos
 *
 * Version 1.0
 *
 */
package at.cube.einnahmen;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;


// Main-Class:
public class EinnahmenMain extends Application
{   
    @Override
    public void start(Stage stage)
    {       
       GridPane grid = new GridPane();
       grid.setBackground(new Background(new BackgroundFill(Color.rgb(140, 200, 140), new CornerRadii(0), new Insets(0))));
       grid.setAlignment(Pos.CENTER);
       grid.setHgap(30);
       grid.setVgap(50);
       grid.setPadding(new Insets(0, 0, 2, 1));
      
       stage.setTitle("Einnahmen-Verwaltung");
      
       /*
       // Image hinzufügen:       
       try
       {
           FileInputStream imageStream = new FileInputStream("/tux/netBeansProjects/Einnahmen/res/Express-Zustellung.png");
           Image image = new Image(imageStream);
           grid.add(new ImageView(image), 3, 1);
       }
       catch (FileNotFoundException err)
       { Logger.getLogger(EinnahmenMain.class.getName()).log(Level.SEVERE, null, err); }
       */
      
       // Leistung hinzufügen:
       ButtonEintragHinzufuegen buttonHinzufuegen = new ButtonEintragHinzufuegen("ADD Activity");       
       ButtonInitialisieren.buttonInitialisieren(stage, grid, buttonHinzufuegen, 0, 1);
      
       // Leistung enfernen:
       ButtonEintragEntfernen buttonEintragEntfernen = new ButtonEintragEntfernen("Purge Entry");
       ButtonInitialisieren.buttonInitialisieren(stage, grid, buttonEintragEntfernen, 1, 1);
      
       // Alles anzeigen:
       ButtonDatenbankAbfragen buttonAnzeigen = new ButtonDatenbankAbfragen("Show All");
       ButtonInitialisieren.buttonInitialisieren(stage, grid, buttonAnzeigen, 2, 1);
      
       Button buttonExit = new Button("EXIT");
       grid.add(buttonExit, 0, 2, 3, 1);
       buttonExit.setPrefSize(100, 20);
       grid.setHalignment(buttonExit, HPos.CENTER);
      
       buttonExit.setOnAction(event -> stage.close());
      
       Scene scene = new Scene(grid, 900, 300);
       stage.setScene(scene);
       stage.show();
    }
        
    
    // Main:
    public static void main(String... args)
    { launch(args); }
}
 

volcanos

Bekanntes Mitglied
ButtonDatenbankAfragen

Java:
package at.cube.einnahmen;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.util.Callback;


public class ButtonDatenbankAbfragen extends Button implements ButtonVorlage
{      
    private ObservableList<ObservableList> data;
    private TableView tableview;
   
    public ButtonDatenbankAbfragen (String text)
    { super(text); }
   
   
    // Stage:
    @Override
    public void neuesFenster (Stage hauptFenster)
    {
        //TableView
        tableview = new TableView();
        buildData();

        //Main Scene
        //  Scene scene = new Scene(root, 1200, 700);
        Scene scene = new Scene(tableview, 1000, 500);        
       
        Stage neuesFenster = new Stage();
        neuesFenster.setTitle("Show All");
        neuesFenster.initModality(Modality.WINDOW_MODAL);
        neuesFenster.initOwner(hauptFenster);
        neuesFenster.setX(hauptFenster.getX() + 20);
        neuesFenster.setY(hauptFenster.getY() + 20);      
     
        neuesFenster.setScene(scene);
        neuesFenster.show();      
    }
   
   
    // Datenbank-Build:
    public void buildData()
    {
        data = FXCollections.observableArrayList();
       
        try
        {
            String driverClass = "com.mysql.cj.jdbc.Driver";
            Class.forName(driverClass);
           
            String url = "jdbc:mysql://localhost:3306/billing?allowPublicKeyRetrieval=true&useSSL=false";
            Connection con = DriverManager.getConnection(url, "test", "test888");          
            Statement stmt = con.createStatement();
            String query = "select * from  billing.einnahmen order by datum desc";  
            ResultSet rs = stmt.executeQuery(query);
           
            for (int i = 0; i < rs.getMetaData().getColumnCount(); i++)
            {
                final int j = i;
               
                TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
                col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>()
                {
                    public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param)
                    { return new SimpleStringProperty(param.getValue().get(j).toString()); }
                });

                tableview.getColumns().addAll(col);              
            }

            while (rs.next())
            {
                // Iterate Rows:
                ObservableList<String> row = FXCollections.observableArrayList();
               
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
                {
                    // Iterate Columns:
                    row.add(rs.getString(i));
                }
                data.add(row);
            }

            // Finally ADD to tableView:
            tableview.setItems(data);
           
        } catch (Exception err) { /** Hinweis.ausgeben(null, "DD99: Datenbank-Fehler !!!" + err.getMessage());  */  }
    }  
}
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
ButtonEintragEntfernen


Code:
package at.cube.einnahmen;

import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.paint.Color;


public class ButtonEintragEntfernen extends Button implements ButtonVorlage
{  
    static boolean ok = false;
   
    public ButtonEintragEntfernen (String text)
    { super(text); }
   
    public void neuesFenster (Stage hauptFenster)
    {
        GridPane grid = new GridPane();
        grid.setBackground(new Background(new BackgroundFill(Color.rgb(140, 200, 140), new CornerRadii(0), new Insets(0))));
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(10, 10, 10, 10));

        Scene scene = new Scene(grid, 400, 300);

        Stage neuesFenster = new Stage();
        neuesFenster.setTitle("Purge Entry");
        neuesFenster.setScene(scene);
        neuesFenster.initModality(Modality.WINDOW_MODAL);
        neuesFenster.initOwner(hauptFenster);
        neuesFenster.setX(hauptFenster.getX() + 50);
        neuesFenster.setY(hauptFenster.getY() + 50);

        Text titel = new Text("Purge ID");
        titel.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
        grid.add(titel, 0, 0, 2, 1);

        Label idLabel = new Label("ID:");
        grid.add(idLabel, 0, 1);
        TextField eingabeID = new TextField();
        grid.add(eingabeID, 1, 1);

        Button buttonEntf = new Button("Purge Entry");
        grid.add(buttonEntf, 1, 2);  
       
        Button buttonExit = new Button("Exit");
        grid.add(buttonExit, 1, 5);
       
        neuesFenster.show();

        buttonExit.setOnAction(event -> neuesFenster.close());
       
        buttonEntf.setOnAction((ActionEvent e) ->
        {
            int id = -1;          
           
            try
            {
                id = Integer.parseInt(eingabeID.getText());
                ok = true;
            }
            catch(NumberFormatException Ausnahme){ Hinweis.ausgeben(hauptFenster, "Fehlerhafte Eingabe !"); }
           
            if(ok)
            {
                try
                {                  
                    String driverClass = "com.mysql.cj.jdbc.Driver";
                    Class.forName(driverClass);
                   
                    String url = "jdbc:mysql://localhost:3306/billing?allowPublicKeyRetrieval=true&useSSL=false";
                    Connection con = DriverManager.getConnection(url, "test", "test888");
                    Statement stmt = con.createStatement();                  
                   
                    String query = "select id from billing.einnahmen where id = " + id;
                    ResultSet rs = stmt.executeQuery(query);
                   
                    int zaehler = 0;
                    while (rs.next())
                    { zaehler++; }
                   
                    if (zaehler > 0)
                    {
                        query = "delete from billing.einnahmen where id = " + id + " limit 1";
                        stmt.executeUpdate(query);
                        Hinweis.ausgeben(hauptFenster, "Entry deleted !");                      
                    }
                    else
                    { Hinweis.ausgeben(hauptFenster, "ID not exists !"); }
                }
                catch (ClassNotFoundException err)
                {
                    Logger.getLogger(ButtonEintragEntfernen.class.getName()).log(Level.SEVERE, null, err);
                    Hinweis.ausgeben(hauptFenster, "Error: Verbindung zum JDBC-Driver nicht möglich !!!");
                    ok = false;
                }                      
                catch ( SQLException err )
                {
                    Hinweis.ausgeben(hauptFenster, "DD99: Datenbank-Fehler !!!" + err.getMessage());
                    ok = false;
                }              
            }
        });
    }
}
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
ButtonEintragHinzufuegen

Code:
package at.cube.einnahmen;

import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;


public class ButtonEintragHinzufuegen extends Button implements ButtonVorlage
{
    static double UST;
    static double netto;
    
    ButtonEintragHinzufuegen(String text)
    { super(text); }
    
    public void neuesFenster (Stage hauptFenster)
    {                   
        GridPane grid = new GridPane();
        grid.setBackground(new Background(new BackgroundFill(Color.rgb(140, 200, 140), new CornerRadii(0), new Insets(0))));
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(10, 10, 10, 10));
        
        Scene scene = new Scene(grid, 400, 300);
        
        Stage neuesFenster = new Stage();
        neuesFenster.setTitle("ADD Activity");
        neuesFenster.setScene(scene);
        neuesFenster.initModality(Modality.WINDOW_MODAL);
        neuesFenster.initOwner(hauptFenster);
        neuesFenster.setX(hauptFenster.getX() + 50);
        neuesFenster.setY(hauptFenster.getY() + 50);
                
        Label datum = new Label("Date:");
        grid.add(datum, 0, 1);
        TextField eingabeDatum = new TextField();
        grid.add(eingabeDatum, 1, 1);
        
        Label leistung = new Label("Activity:");
        grid.add(leistung, 0, 2);
        TextField eingabeLeistung = new TextField();
        grid.add(eingabeLeistung, 1, 2);

        Label firma = new Label("Company:");
        grid.add(firma, 0, 3);
        TextField eingabeFirma = new TextField();
        grid.add(eingabeFirma, 1, 3);
 
        Label brutto = new Label("Brutto:");
        grid.add(brutto, 0, 4);
        TextField eingabeBrutto = new TextField();
        grid.add(eingabeBrutto, 1, 4);
        
        Button LHZF = new Button("ADD");
        grid.add(LHZF, 0, 8);
        
        Label bestaetigung = new Label();
        grid.add(bestaetigung, 1, 10);
        
        Button buttonExit = new Button("EXIT");
        grid.add(buttonExit, 0, 8, 15, 1);
        buttonExit.setPrefSize(100, 23);
        grid.setHalignment(buttonExit, HPos.CENTER);
      
       buttonExit.setOnAction(event -> neuesFenster.close());
        
       neuesFenster.show();
        
       LHZF.setOnAction(event ->
       {       
            DatenbankEinfuegen.datenbankEinfuegen(hauptFenster, eingabeDatum, eingabeLeistung, eingabeFirma, UST, netto, eingabeBrutto, neuesFenster);
                
            if (DatenbankEinfuegen.ok)                                          // ist das Gleiche wie:     if (DatenbankEinfuegen.ok == true)
            {
                bestaetigung.setStyle("-fx-text-fill: blue; -fx-font-size: 16px;");
                bestaetigung.setText("Daten wurden in die Datenbank hinzugefügt !");
            }
            else
            {
                bestaetigung.setStyle("-fx-text-fill: red; -fx-font-size: 16px;");
                bestaetigung.setText("DD99: Datenbank-Fehler !!!");                 
            }           
        });
    }   
}
 

volcanos

Bekanntes Mitglied
ButtonInitialisieren

Code:
package at.cube.einnahmen;

import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;


public class ButtonInitialisieren
{
    public static <T extends Button & ButtonVorlage> void buttonInitialisieren(Stage hauptFenster, GridPane grid, T button, int posX, int posY)
    {
        grid.add(button, posX, posY);
        button.setPrefSize(200, 50);
        
        button.setOnAction(event -> button.neuesFenster(hauptFenster));
    }   
}


ButtonVorlage

Code:
package at.cube.einnahmen;

import javafx.stage.Stage;

public interface ButtonVorlage
{ public void neuesFenster(Stage hauptFenster); }


Hinweis

Code:
package at.cube.einnahmen;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Modality;
import javafx.stage.Stage;


public class Hinweis
{   
    public static void ausgeben (Stage fenster, String text)
    {
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(10, 10, 10, 10));
        
        Scene scene = new Scene(grid, 300, 200);
        Label label = new Label(text);
        
        Button button = new Button("OK");
        grid.add(label, 0,0);
        grid.add(button, 0,1);
        
        Stage hinweisfenster = new Stage();
        hinweisfenster.initModality(Modality.WINDOW_MODAL);
        hinweisfenster.initOwner(fenster);
        hinweisfenster.setX(fenster.getX() + 30);
        hinweisfenster.setY(fenster.getY() + 30);
        hinweisfenster.setScene(scene);
        hinweisfenster.show();
        
        button.setOnAction(event -> hinweisfenster.close());
    }
}
 

volcanos

Bekanntes Mitglied
DatbenbankEinfuegen

Code:
package at.cube.einnahmen;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javafx.scene.control.TextField;
import javafx.stage.Stage;


public class DatenbankEinfuegen
{
    static String datum = "";
    static String leistung = "";
    static String firma = "";
    static double netto = 0;
    static double UST = 0;
    public static double brutto = 0;
   
    static boolean ok = false;      
   
    public static void datenbankEinfuegen (Stage hauptFenster, TextField eingabeDatum, TextField eingabeLeistung, TextField eingabeFirma, double n, double u, TextField eingabeBrutto, Stage neuesFenster)
    {          
        try
        {
            datum = eingabeDatum.getText();
            leistung = eingabeLeistung.getText();
            firma = eingabeFirma.getText();
            brutto =  Double.parseDouble(eingabeBrutto.getText());
            netto =  brutto / 1.2;
            UST =  brutto - netto;          
           
            ok = true;
        }
        catch(NumberFormatException e){ Hinweis.ausgeben(hauptFenster, "Error: Falsche Eingabe !!!"); }
       
        if (ok)
        {        
            try
            {      
                String driverClass = "com.mysql.cj.jdbc.Driver";
                Class.forName(driverClass);  
               
                String url = "jdbc:mysql://localhost:3306/billing?allowPublicKeyRetrieval=true&useSSL=false";
                Connection con = DriverManager.getConnection(url, "test", "test888");
        String query = "insert into billing.einnahmen (datum, leistung, firma, netto, UST, brutto) values (?, ?, ?, ?, ?, ?)";
               
                // Vorbereitung für Java-SQL-Statement:      
                PreparedStatement preQuery = con.prepareStatement(query);
                preQuery.setString(1, datum);
                preQuery.setString(2, leistung);
                preQuery.setString(3, firma);
                preQuery.setDouble(4, netto);
                preQuery.setDouble(5, UST);
                preQuery.setDouble(6, brutto);        
                preQuery.executeUpdate();
                ok = true;
            }
            catch (ClassNotFoundException err)                  
            {
                Hinweis.ausgeben(hauptFenster, "Error: Verbindung zum JDBC-Driver nicht möglich !!!");              
                ok = false;                
            }          
            catch (SQLException err)
            {  
        Hinweis.ausgeben(hauptFenster, "DD99: Datenbank-Fehler !!!" + err.getMessage());                        
                ok = false;
            }        
        }
    }  
}
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
SystemInfo wird automatisch erstellt

Code:
package at.cube.einnahmen;


public class SystemInfo
{
    public static String javaVersion()
    { return System.getProperty("java.version"); }

    public static String javafxVersion()
    { return System.getProperty("javafx.version"); }
   
    public static String classPath()
    { return System.getProperty("java.classpath"); }
}


Habe ich hinzugefügt, ist aber für nix:
public static String classPath()
{ return System.getProperty("java.classpath"); }
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
Das Hauptprogramm, was immer App bei JavaFX heißt habe ich umbenannt in EinnahmenMain (mit Refaktor sowie auch in der pom.xml !)

Dann hat das Programm vorerst nicht funktioniert, weil Maven mit dem MySQL-Connector nicht so ohne weiteres klar kommt !
Dann habe ich in der pom.xml diese Zeilen hinzufügen müssen:

Code:
<!-- MySQL-Connector Configuration: Beginn: -->          
        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
        <exclusions>
        <exclusion>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        </exclusion>
        </exclusions>
        </dependency>
  <!-- MySQL-Connector Configuration: Ende: -->

Dann hat das Programm trotzdem nicht funktioniert, weil in der in der module-info.java das
requires java.sql;
gefehlt hat. Das habe ich hinzugefügt.

Danach ist es in NetBeans super gelaufen.
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
Wenn ich das Projekt starte schreibt er in die Console folgendes raus:


cd /tux/netBeansProjects/Einnahmen; JAVA_HOME=/usr/lib/jvm/jdk-18 /opt/netbeans-14/netbeans/java/maven/bin/mvn -Dexec.vmArgs= -Dexec.appArgs= javafx:run
Running NetBeans Compile On Save execution.
Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their
jar artifacts.



Scanning for projects...

-------------------------< at.cube:Einnahmen >--------------------------
Building Einnahmen 1.0-SNAPSHOT
--------------------------------[ jar ]---------------------------------

>> javafx-maven-plugin:0.0.4:run (default-cli) > process-classes @ Einnahmen >>>

--- maven-resources-plugin:2.6:resources (default-resources) @ Einnahmen ---
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory /tux/netBeansProjects/Einnahmen/src/main/resources

--- maven-compiler-plugin:3.8.0:compile (default-compile) @ Einnahmen ---
Nothing to compile - all classes are up to date

<<< javafx-maven-plugin:0.0.4:run (default-cli) < process-classes @ Einnahmen <<<


--- javafx-maven-plugin:0.0.4:run (default-cli) @ Einnahmen ---
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 33.342 s
Finished at: 2022-09-14T08:31:39+02:00
------------------------------------------------------------------------
 

volcanos

Bekanntes Mitglied
cat module-info.java

module at.cube.einnahmen {
requires javafx.controls;
requires java.sql;
requires javafx.graphics;
requires javafx.base;
requires java.base;
exports at.cube.einnahmen;
}

Hier fehlt der PATH bzw. CLASSPATH, oder ?
 

Neumi5694

Top Contributor
"Launch script" hab ich mal ganz generisch gemeint, unabhängig von der IDE. Das mag auch ein bat- oder bash-Script sein oder auch der direkte Aufruf über die Kommandozeile oder eine kompilierte .exe oder die Browser-Engiene, die Java startet oder oder oder ...
Irgend etwas halt, welches sich die Systemvariable holt und für den Aufruf der JVM verwendet.

@KonradN ist - was die FX Fragen und die Module angeht - der bessere Ansprechpartner, der macht das schon. Ich hab das nur der Vollständigkeit halber erwähnt, weil diese Settings zu überprüfen, nur in sehr spezialisierten Fällen was bringt.
 

volcanos

Bekanntes Mitglied
in der .bashrc sind nur die allgemeinen Java-Pfade drinnen - keine javafx-module und so:

export CLASSPATH=.:/usr/share/java/mysql-connector-java.jar
export JAVA_HOME=/usr/lib/jvm/jdk-18
export JAVAFX_HOME=/usr/lib/jvm/javafx-sdk-18.0.2
export PATH=$PATH:/usr/lib/jvm/jdk-18/bin

In der jdk-18 gibt es bin's
und in der javafx-sdk-18.0.2 gibt es diese nicht !
Nur lib's !
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Jetzt habe ich das einmal grob angesehen - die Struktur ist evtl. etwas ungewohnt, aber es lässt sich starten. Ich habe natürlich keine MySQL Datenbank, aber die Fenster öffnen sich und es ging ja nicht um die Datenbank-Aktionen.

Aber ich habe dabei jetzt keine Auffälligkeiten gefunden. Es gibt nur das Haupt-Fenster, welches als "Einnahmen-Verwaltung" erscheint. Das zusätzliche Fenster erscheint als z.B. "ADD Activity" und kann geschlossen und wieder geöffnet werden.

Das alles jetzt auf einem Mac. Wenn Du von bashrc sprichst, dann arbeitest Du unter Linux nehme ich mal an. Das sollte aber ok sein.

Ein mögliches Problem, was zu so Fenstern mit (2) führen kann: Evtl. hast Du etwas zwei Mal gestartet?
/opt/netbeans-14/netbeans/java/maven/bin/mvn -Dexec.vmArgs= -Dexec.appArgs= javafx:run
Dies führt nicht nur die Übersetzung durch sondern auch ein Start. Falls das in NetBeans als "Übersetzung" hinterlegt wurde und noch ein weiterer Aufruf von Java erfolgt, dann wäre das eine mögliche Erklärung.

Oder evtl. habe ich auch das konkrete Problem gerade nicht richtig im Kopf - das sollte man ggf. erst einmal klären - ehe ich dann später Hinweise zum Code bringe (Das wird bestimmt auch interessant für Dich, aber sollte jetzt erst einmal keine Rolle spielen. So Du das nicht anders siehst, würde ich mich erst auf das eigentliche Problem konzentrieren.)


Edit: Sorry, war jetzt etwas durcheinander mit einem anderen Thread - diese Antwort ist so (teilweise) wenig sinnvoll. Daher einiges gestrichen ... es kommt jetzt gleich noch eine andere Antwort!
 

volcanos

Bekanntes Mitglied
Ich habe Linux_Mint_21 und Window_11. Und auf beiden OS kann ich in der command_line nur die Java-Swing-MySQL-Programme starten,
die Java-JavaFX-Programme jedoch in beiden OS nur in NetBeans selber !

Ja, und mit Mac kann ich nicht dienen - nicht das ich mich mit Mac nicht auskenne.
War mal im technischen Telefon-Support bei der Telekom Austria (3rd Level -> die letzte Rettung)...
da mussten wir alles können: Windows, Linux und auch Mac 🥸
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ok, zweiter Ansatz, dieses Mal mit hoffentlich richtigem Fokus :)

Du willst das JavaFX Programm auch außerhalb der Entwicklungsumgebung laufen lassen. Das versuchst Du derzeit mit einer JAR Datei - das ist ein Ansatz, der seit Java 9 nicht mehr der Weg ist, der hier gegangen wird. Mit Java 9 ist JLink eingeführt worden, dass ein sogenanntes Image baut, dass alles enthält, was man zur Ausführung braucht.

Du nutzt das JavaFX Plugin von openjfx: In dem Aufruf war der mvn Aufruf mit javafx:run zu sehen.

Du musst jetzt nur Maven mit javafx:jlink aufrufen. Dies baut das Image welches Du nach einem erfolgreichen Lauf dann im target Verzeichnis in einem Unterverzeichnis finden kannst. Das Verzeichnis enthält dann alles, was man braucht - in der Regel mit einem Startscript im bin Ordner (so dies konfiguriert wurde).

Hier kann die Konfiguration des javafx Plugins in der pom.xml interessant sein - da kann das eine oder andere noch konfiguriert werden.

Wichtig ist: Das Image ist immer für das Betriebssystem, auf dem es erstellt wurde (enthält halt auch die Java Runtime und die JavaFX Abhängigkeiten sind auch Plattform spezifisch.)

Es kann aber weitere Probleme geben wenn Abhängigkeiten keine modul-Information enthalten. Aber das behandeln wir, wenn es dazu kommen sollte.
 

volcanos

Bekanntes Mitglied
Habe bei den Properties->Action->RunProjekt das
clean javafx:run
mit
clean javafx:jlink

Jetzt wird das Programm in NetBeans nur mehr kompiliert - ohne Start.

Und zusätzlich ist jetzt im Verz. /tux/netBeansProjects/Einnahmen/target/ ein image/ neu drinnen, welches folgende Verz. enthält:
bin/ conf/ include/ legal/ lib/ man/

und eine release-Datei mit folgenden Inhalt:
JAVA_VERSION="18.0.2.1"
MODULES="java.base java.logging java.transaction.xa java.xml java.sql java.datatransfer java.prefs java.desktop javafx.base jdk.unsupported javafx.graphics javafx.controls at.cube.einnahmen"

Aber wie man das Programm startet, weiß ich nicht :(
 

KonradN

Super-Moderator
Mitarbeiter
Ist in dem bin Ordner kein Script?

Also typische Einträge beim JavaFX Plugin ist etwas wie:
XML:
<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.8</version>
    <configuration>
        <mainClass>DeinModulName/at.cube.einnahmen.EinnahmenMain</mainClass>
        <launcher>einnahmen</launcher>
        <jlinkImageName>einnahmen</jlinkImageName>
        <jlinkZipName>einnahmenzip</jlinkZipName>
    </configuration>
</plugin>

Wichtig ist halt:
  • die main class muss angegeben sein (Das ist schon der Fall, sonst wäre javafx:run nicht gelaufen!)
  • launcher gibt den Namen der launch Skripte an. Die entstehen im bin Verzeichnis.
  • jlinkImageName gibt an, wie das Verzeichnis heissen soll.
  • Mit dem ZipName kannst Du angeben, dass er es auch gleich in ein ZIP packen soll.
 

volcanos

Bekanntes Mitglied
Bei mir ist kein modulename angegeben und der launcher und das jlink fehlt auch:
Java:
 <plugin>

                <groupId>org.openjfx</groupId>

                <artifactId>javafx-maven-plugin</artifactId>

                <version>0.0.4</version>

                <configuration>

                    <mainClass>at.cube.einnahmen.EinnahmenMain</mainClass>

                </configuration>

                <executions>

                    <execution>

                        <!-- Default configuration for running -->

                        <!-- Usage: mvn clean javafx:run -->

                        <id>default-cli</id>

                    </execution>

                    </plugin>
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Dann füg erst einmal einen Eintrag für launcher hinzu - dann solltest Du entsprechende Startskripte bekommen.

Das kein Modulname angegeben wurde solltest Du im Hinterkopf behalten - wenn es in der Zukunft zu Problemen kommen sollte, dann liegt das ggf. daran.
 

volcanos

Bekanntes Mitglied
habe jetzt

<launcher>einnahmen</launcher>
<jlinkImageName>einnahmen</jlinkImageName>
<jlinkZipName>einnahmenzip</jlinkZipName>

hinzugefügt, in der pom.xml

Jetzt ist die zip-datei da ... und wenn man es unzippt, dann ist jetzt eine neues bin mit Namen einnahmen im bin/ drinnen.
Das kann man mit
. einnahmen
oder mit
sh ./einnahmen
starten

Dann kann man das HauptFenster und auch die Nebenfenster aufmachen, aber jetzt sind wir wieder am Anfang angekommen,
wo die Probleme mit dem mysql-Connector (JDBC-Driver) waren:

at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:186)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
 

volcanos

Bekanntes Mitglied
ok ...

Ich habe mal in einem Java-Buch gelesen, das nur die ersten 2 oder 3 ausschlaggebend sind.
Da hat sich der Author dann wohl geirrt.

Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: javax/naming/NamingException
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:186)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
at at.cube.einnahmen/at.cube.einnahmen.ButtonDatenbankAbfragen.buildData(ButtonDatenbankAbfragen.java:64)
at at.cube.einnahmen/at.cube.einnahmen.ButtonDatenbankAbfragen.neuesFenster(ButtonDatenbankAbfragen.java:35)
at at.cube.einnahmen/at.cube.einnahmen.ButtonInitialisieren.lambda$buttonInitialisieren$0(ButtonInitialisieren.java:15)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8890)
at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3862)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2590)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 51 more
 

volcanos

Bekanntes Mitglied
Das Programm funktioniert jetzt grundsätzlich in der command_line oder über eine grafische Oberfläche.
Ich bin bin mir sicher, dass der Wurm in der Anbindung über jdbc-mysql-connector drinnen ist !
 

KonradN

Super-Moderator
Mitarbeiter
Bei dem JLink werden nur die Module kopiert, die wirklich notwendig sind (laut modules-info.java). Und da fehlt dann jetzt wohl schlicht ein Modul. Füg mal in deiner module-info.java ein
requires java.naming;
ein.

Edit: Typo entfernt.
 

volcanos

Bekanntes Mitglied
Also Konrad, du bist echt der Beste 👍 Echt a Wahnsinn :)

Jetzt funktioniert auch die Datenbank-Anbindung über das mit "javafx:jlink" erstellte Image.

Es fehlte tatsächlich das
requires java.naming;
in der module-info.java
 
Zuletzt bearbeitet:

volcanos

Bekanntes Mitglied
Anscheinend ist bei der Error-Exception die "Caused by: ..." wichtiger als die ersten Zeilen bei "Exception in thread ... :"

Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
 

KonradN

Super-Moderator
Mitarbeiter
Anscheinend ist bei der Error-Exception die "Caused by: ..." wichtiger als die ersten Zeilen bei "Exception in thread ... :"

Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
Bei Exceptions ist immer wichtig:

a) Wenn man eine Kette von Exceptions hat, dann liest man diese von unten nach oben. Bei Dir ist dann also dann auch mit diese:
Java:
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 51 more
Das hilft Dir jetzt nicht wirklich viel - die Exception und Nachricht sind ja auch gleich geblieben. Aber wenn Exception mit neuer Nachricht weiter gegeben werden, dann schaut man, von da, wo es passiert ist. Da kann also eine FileNotFound Exception sein und weiter oben sind dann plötzlich andere Exceptions a.la. fehlerhafte Konfiguration oder so.

Hier ist es aber meist so, dass man bis zu der Exception hoch geht, bei der auch der eigene Code zu finden ist.

b) Die eigentliche Ursache ist dann natürlich in der Zeile Caused by - die ist wichtig, um zu wissen, was überhaupt passiert ist. (In Deinem Fall: die Klasse javax.naming.NamingException konnte nicht gefunden werden. Bei sowas ist dann immer die Frage: Wo findet sich diese Klasse? Fehlt eine Abhängigkeit oder so wie bei Dir ein Modul?)

c) Der Call-Stack hilft dann nur, den Ort zu finden, wo das Problem aufgetaucht ist. Da ist dann wichtig, dass man den ggf. sogar bis zum eigenen Code zurück verfolgt. Das sieht man bei dir in der oberen Exception:
at at.cube.einnahmen/at.cube.einnahmen.ButtonDatenbankAbfragen.buildData(ButtonDatenbankAbfragen.java:64)
Da wurde halt getConnection vom DriverManager aufgerufen.

Das wäre so eine kleine Erläuterung / Übersicht.
 

volcanos

Bekanntes Mitglied
Neu für mich ist, dass man die Exception von Unten nach Oben liest.
Das wird in keinem Java-Buch so beschrieben. Ist aber so !
Das habe ich jetzt verstanden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
thor_norsk Eclipse - Fehlermeldung - JavaFX Allgemeine Java-Themen 24
G JavaFX Maven Projekt als .exe Datei exportieren Allgemeine Java-Themen 10
C Java11+ JavaFX HtmlEditor ContextMenu neue MenuItems hinzufügen Allgemeine Java-Themen 5
G JavaFX var Ausdruck Allgemeine Java-Themen 1
G javafx "class path" exception Allgemeine Java-Themen 5
K Anzeigemöglichkeit von Bildern in JavaFX mit Hilfe von MongoDB GridFS Allgemeine Java-Themen 0
M JavaFX Allgemeine Java-Themen 13
P JavaFX Anwendung beendet sich selbst nur als Jar Allgemeine Java-Themen 40
L JavaFX JavaFX Chart in Apache Poi Excel Datei Allgemeine Java-Themen 2
A Zusammenspiel javafx Fenster Allgemeine Java-Themen 1
D JavaFX mit JDK 12 Allgemeine Java-Themen 31
H Internationalisierung I18n in JavaFx? Allgemeine Java-Themen 7
Tarrew JavaFX: K-NN Decision Boundary plotten (Mesh-Grid, Polylines, ... ?? ) Allgemeine Java-Themen 1
D Compiler-Fehler JavaFX - Bekomme Fehlermeldungen nicht weg Allgemeine Java-Themen 31
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M List -Tableview-Javafx-Vererbung Allgemeine Java-Themen 35
RalleYTN 2D-Grafik Bild ohne AWT, Swing und JavaFX rotieren Allgemeine Java-Themen 12
U JAVAFX Simulation Allgemeine Java-Themen 1
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
Sam96 JavaFX Benutzerrechte Allgemeine Java-Themen 6
J javaFX mySQL Allgemeine Java-Themen 3
P JavaFX HTMLEditor Menü Allgemeine Java-Themen 0
L JavaFX JavafX externe FXML laden? Allgemeine Java-Themen 4
S JavaSE, JavaEE oder JavaFX? Allgemeine Java-Themen 5
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
B JavaFX fxml, die selbe Instanz der Klasse Allgemeine Java-Themen 4
M JavaFX-Gegenstück zu Swing-Button-DoClick-Methode Allgemeine Java-Themen 5
O Start externer Programme Allgemeine Java-Themen 1
T Programme ausführen.. Allgemeine Java-Themen 3
DanielsLPecke Java Arrays an andere Java Programme schicken und zurück Allgemeine Java-Themen 5
T Während des Programmlaufs andere Programme ausführen Allgemeine Java-Themen 1
J Programme erklären Allgemeine Java-Themen 1
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
C Prozesssteuerung - Speicherhungrige externe Programme werden blockiert Allgemeine Java-Themen 2
F Mit Java Programme aus der Taskleiste auslesen Allgemeine Java-Themen 5
E Eure erstellten Programme Allgemeine Java-Themen 3
B Externe Programme und ProcessBuilder Allgemeine Java-Themen 5
G Library für CNC Programme Allgemeine Java-Themen 2
J Können Programme sich selbst erweitern? Allgemeine Java-Themen 6
Fu3L Java Programme an Taskleiste anheften Allgemeine Java-Themen 5
D externe programme / Jdesktoppane, ... Allgemeine Java-Themen 6
M Plugins für eigene Programme Allgemeine Java-Themen 3
GilbertGrape Jetty-Dienst startet keine Programme mit Oberfläche Allgemeine Java-Themen 2
C Programme Modularisieren Allgemeine Java-Themen 2
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
F GCJ bzw. native Java-Programme Allgemeine Java-Themen 7
P Bekannte in Java geschriebene Programme Allgemeine Java-Themen 15
W Einfaches Installer/setup tool für java programme das. Allgemeine Java-Themen 4
C Java 6 Programme irgendwie lauffähig machen für Mac 10.5 Allgemeine Java-Themen 11
P Server für Java- Programme Allgemeine Java-Themen 8
J Services - Programme laden (Speicherproblem?) Allgemeine Java-Themen 7
A State-of-the-Art Techniken für Desktop Programme ? Allgemeine Java-Themen 3
D mehrere Programme miteinander kommunizieren lassen Allgemeine Java-Themen 12
X Java Programme verschlüssen Allgemeine Java-Themen 14
P Java 6 kompilierte programme laufen die auch unter JRE 1.4.x Allgemeine Java-Themen 43
M Fremde Programme öffnen? Allgemeine Java-Themen 16
S programme? Allgemeine Java-Themen 2
S Programme für Struktogramm? Allgemeine Java-Themen 16
S 5. Programme, die EXE-Dateien aus JAVA-Anwendungen erstellen Allgemeine Java-Themen 4
K Mit Java kleine Freeware Programme erstellen. Geht das? Allgemeine Java-Themen 16
Y Aus einem Java Programm andere (Exe-)Programme starten Allgemeine Java-Themen 3
8 Programme für bestimmte Dateitypen finden Allgemeine Java-Themen 6
T Benötigte Programme für Java ! Allgemeine Java-Themen 29
F Shell-Programme per Runtime.exec() starten und mehr? Allgemeine Java-Themen 4
M Programme auf anderen Rechnern auführen Allgemeine Java-Themen 4
H java Programme als batch starten Allgemeine Java-Themen 13
S java Programme über Konsole starten Allgemeine Java-Themen 5
T Java Programme verpacken Allgemeine Java-Themen 15
S programme schreiben Allgemeine Java-Themen 3
Z Java Programme laufen nicht zusammen Allgemeine Java-Themen 9
K java programme auf deutsch? Allgemeine Java-Themen 4
Q Programme ausführen Parameter einstellen Allgemeine Java-Themen 9
T mit Java per DDE auf Windows-Programme zugreifen Allgemeine Java-Themen 7
V Fehlerfreie Java-Programme lassen sich nicht ausführen Allgemeine Java-Themen 2
G Programme mit Java öffnen Allgemeine Java-Themen 7
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
A Garbage Collector in NetBeans vs. exe Anwendung Allgemeine Java-Themen 33
L DefaultTableModel ("Netbeans IDE 8.1") Allgemeine Java-Themen 6
F Netbeans Version Allgemeine Java-Themen 2
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
x22 Hintergrund in Netbeans ändern Allgemeine Java-Themen 3
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
G Merkwürdiger Fehler NetBeans Allgemeine Java-Themen 2
P Eclipse Gemeinsam mit NetBeans an einem Projekt arbeiten? Allgemeine Java-Themen 3
D NetBeans Programm in NetBeans deutlich schneller als als Jar Allgemeine Java-Themen 33
E Wie Timer anbringen mit Designer in Netbeans Allgemeine Java-Themen 5
S "Code too large" bei Netbeans Allgemeine Java-Themen 16
T Einbinden einer Library in NetBeans Allgemeine Java-Themen 3
S Applet in Java NetBeans Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben