Netbeans die JavaFX-Anwendung wird nicht ausgeführt

Java0123

Mitglied
Hallo zusammen,

ich versuche gerade mit Netbeans 18 eine JavaFX FXML "Hallo Welt Anwendung" zu erstellen.
Wenn ich auf F6 klicke startet das Programm, aber wenn ich versuche das Programm mit Doppelklick auszuführen passiert nichts. Woran kann das liegen?
Klick auf grünes Pfeil oder F6

java-forum-jl.png

Das wird angezeigt

java-hallo-welt-jl.png
Wenn ich auf "Build" klicke dann wird ein neues Verzeichnis "target" erstellt.

java-verz-jl.png

In diesem Verzeichnis wird neues Datei "mavenproject2-1.0-SNAPSHOT.jar" erstellt.

java-ergebnis-jlpng.png

Beim Klick drauf passiert nichts. Wie kann ich es starten?
Mein Java
java --version
openjdk 17.0.7 2023-04-18
OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7)
OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing)

javadoc --version
javadoc 17.0.7
 
Dann stimmt etwas mit dem Maven Projekt nicht. Bei so fragen also bitte immer auch die ganze pom.xml zeigen. Es sind drei Dinge notwendig, damit so etwas funktioniert:
a) Es muss im Manifest die Startklasse angegeben worden sein.
b) Es müssen die Abhängigkeiten vorhanden sein
c) Auf Grund einer Eigenheit von JavaFX, muss ggf. eine eigenständige Klasse mit main Methode aufgestellt werden. Innerhalb der Klasse, die von Application erbt, würde es auch nicht funktionieren.

Generell ist das aber auch nicht der Weg, wie man aktuell Applikationen weitergibt. Von den jar Dateien ist man mit Java 9 abgerückt und statt dessen werden Images gebaut und diese weiter gegeben. Hier könnte es Sinn machen, sich z.B. einmal kneitzel/JavaFXMavenApp: Simple JavaFX App with Maven (github.com) anzusehen und dieses Projekt als Grundlage zu nehmen.

Alternativ kannst Du aber auch auf Getting Started with JavaFX (openjfx.io) zurück greifen um dann aber mit module-info.java (Java Modulen) zu arbeiten.
 
Meine pom.xml

XML:
<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>com.mycompany</groupId>
    <artifactId>mavenproject2</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>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</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>com.mycompany.mavenproject2.App</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>

Ich glaube ich habe keine Manifest-Datei. Netbeans hat alles automatisch generiert. Wo soll diese Datei sein?
Müssen noch im Windows Umgebungsvariablen für JavaFX manuell angepasst werden?
 
Damit verwendet Netbeans das openjfx Plugin. Du erzeugt keine JAR Datei sondern ein Image, in dem Du das Maven Ziel javafx:jlink aufrufst.

In dem <configuration> tag kannst Du aber noch weitere Konfigurationen vornehmen. Schau Dir dazu einfach einmal die GitHub Seite des Plugins an:
openjfx/javafx-maven-plugin: Maven plugin to run JavaFX 11+ applications (github.com)

Ich würde zumindest mit launcher den Namen des Startscriptes setzen:
XML:
<configuration>
    <mainClass>com.mycompany.mavenproject2.App</mainClass>
    <launcher>MyApplicationName</launcher>
</configuration>
 
Vielen Dank!
Hab hier Lösung gefunden

XML:
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>spring-boot</classifier>
                <mainClass>
                  com.mycompany.executable.App
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

Die Datei ist 9,3Megabyte groß 🙂 . Ziemlich groß für eine "Hallo Welt" Anwendung :-(

Screenshot 2023-06-10 213952.png
 
Du hast doch eine JavaFX Anwendung und keine Spring Boot Anwendung. Was willst Du denn da mit dem Spring Boot Plugin?

Den Weg, wie Du mit dem bereits eingebundenen JavaFX Plugin arbeiten solltest, habe ich Dir bereits genannt.

Wenn Du unbedingt eine ausführbare JAR Datei haben willst, dann kannst Du dafür das Maven Shade Plugin verwenden. Dann werden die Abhängigkeiten mit in das JAR File gepackt. Und natürlich gibst Du die main class auch beim Shade Plugin an.

Das Manifest ist auch nicht Bestandteil des Projekts selbst. Das wird automatisch vom Maven jar plugin erzeugt. Da könnte man die main class übrigens auch mit angeben. Aber wenn man mit dem shade plugin die Abhängigkeitgen mit in das jar File packen will, dann kann man die Konfiguration auch dort vornehmen.
 
Hier ein Versuch ohne Spring meine pom.xml

XML:
<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>com.mycompany</groupId>
 <artifactId>mavenproject3</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>
  <dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-controls</artifactId>
   <version>20</version>
  </dependency>
  <dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-fxml</artifactId>
   <version>20</version>
  </dependency>
 </dependencies>
 <build>
  <plugins>
 
 
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
     <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
       <goal>copy-dependencies</goal>
      </goals>
      <configuration>
       <outputDirectory>
        ${project.build.directory}/libs
       </outputDirectory>
      </configuration>
     </execution>
    </executions>
   </plugin>
 
 
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
     <archive>
      <manifest>
       <addClasspath>true</addClasspath>
       <classpathPrefix>libs/</classpathPrefix>
       <mainClass>
        ${fully.qualified.main.class}
       </mainClass>
      </manifest>
     </archive>
    </configuration>
   </plugin>
 
 
   <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.8</version>
    <configuration>
     <mainClass>com.mycompany.mavenproject3.App</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>

Alle Abhängigkeiten werden im Verzeichnis "target" gespeichert
fffffffff.png

Beim Doppelklick wird nichts ausgeführt.
Wenn ich es versuche im Konsole auszuführen
rrrrrrrrrrrrrrr.png
 
Ich verstehe die Antwort nicht
Auf Grund einer Eigenheit von JavaFX, muss ggf. eine eigenständige Klasse mit main Methode aufgestellt werden.

Das ist meine main-Klasse diese befindet sich in App.java
Java:
package com.mycompany.mavenproject3;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML("primary"), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }

    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
    }

    public static void main(String[] args) {
        launch();
    }

}

Was muss ich hier ändern?
 
Meine Änderungen
In App.java wurde "main" in "ausfuehren" umbenannt.

Java:
package com.mycompany.mavenproject3;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {

 private static Scene scene;

 @Override
 public void start(Stage stage) throws IOException {
  scene = new Scene(loadFXML("primary"), 640, 480);
  stage.setScene(scene);
  stage.show();
 }

 static void setRoot(String fxml) throws IOException {
  scene.setRoot(loadFXML(fxml));
 }

 private static Parent loadFXML(String fxml) throws IOException {
  FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
  return fxmlLoader.load();
 }

public static void ausfuehren(String[] args) {
  launch();
 }

}

Neue Klasse Main.java


Java:
package com.mycompany.mavenproject3;

import static javafx.application.Application.launch;

/**
 *
 * @author Arctic
 */
public class Main {

 public static void main(String[] args) {
  App.ausfuehren(args);
//  launch();
 }
}

Beim Klick auf F6 wird die Anwendung gestartet. Mit Doppelklick startet die Anwendung nicht. Kommt gleiche Fehler JavaFX-Runtime fehlt
 
Zuletzt bearbeitet:
Und was ist, wenn Du es auf der Kommandozeile startest?
Sind alle Abhängigkeiten wirklich da?
Sind die Einträge im Manifest korrekt?

Und noch einmal ganz deutlich: Das ist nicht der Weg, der heutzutage gegangen wird. Mit Java 9 ist JLink eingeführt worden und mit Java 14 JPackage. Das ist der Weg, der gegangen werden sollte. Das ist der Weg, den das JavaFX Plugin auch anbietet.

Und statt die Abhängigkeiten in einem separaten Ordner vorzuhalten, bevorzuge ich immer ein fat jar damit es da keine Probleme mit den Abhängigkeiten gibt.
 
Und was ist, wenn Du es auf der Kommandozeile startest?
Sind alle Abhängigkeiten wirklich da?
JavaFX-Runtime-Komponenten fehlen.



Ich habe eine Anleitung zu jpackage gefunden dort steht aber das ich zuerst .JAR Datei erstellen muss

Application Preparation​

To package your application, you must first build it and create the necessary JAR or module files. Resources needed by your application must also be available on the system used for packaging.
The following application-related information and resources are used for packaging:
  • JAR or module files for the application
  • Application metadata, for example, name, version, description, copyright, license file
  • Installation options, for example, shortcut, menu group, additional launchers, file associations
  • Launch options, for example, application arguments, JVM options
As part of the packaging process, an application image based on the files in the input directory is created. This image is described in Generated Application Image. To test your application before creating an installable package, use the --type app-image option to create only the application image.

Quelle: https://docs.oracle.com/en/java/jav...tml#GUID-786E15C0-2CE7-4BDF-9B2F-AC1C57249134
 
Wieso kopierst Du nicht einfach das Projekt von mir und passt es an? Da ist dann auch JPackage bereits fertig konfiguriert und so.

Manuell würde ich Dir ansonsten immer den Weg über JLink empfehlen. Also erst ein Image bauen. Dazu reicht ein mvn javafx:jlink Aufruf, da dies etwas ist, dass das javafx Plugin mit anbietet.

Und dann nutzt Du nur noch JPackage um aus dem Image ein App-Image zu machen.

Aber dieser Weg muss so nicht zwingend sein zumal JLink Java Module haben will. Das ist mit der Grund, wieso ich da so einen kleinen Rahmen bereit stelle um da so eine Applikation zu erstellen.
 
Hier ist die Lösung ich habe zusätzlich zu deinen Änderungen im Code zusätzlichen "Main.java" Klasse folgendes Code in pom.xml eingefügt
XML:
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
     <execution>
      <goals>
       <goal>shade</goal>
      </goals>
      <configuration>
       <shadedArtifactAttached>true</shadedArtifactAttached>
       <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
         <mainClass>com.mycompany.mavenproject3.Main</mainClass>
        </transformer>
       </transformers>
      </configuration>
     </execution>
    </executions>
   </plugin>

Hier ist die Erklärung

Jetzt wird eine "mavenproject3-1.0-SNAPSHOT-shaded.jar" Datei erstellt welche 9,215KB groß ist diese Datei startet ohne Probleme und ohne Spring-Boot.

Nochmals Danke!
 

Zurück
Oben