Die Javafx-Anwendung funktioniert nicht als laufbar
Posted: 02 Feb 2025, 20:17
Ich möchte Javafx -Entwicklung lernen, aber zuerst muss sichergestellt werden, dass die Anwendung exportiert und selbst ausgeführt werden kann, damit sie in Zukunft mit regulären Benutzern geteilt werden kann - vorzugsweise Linux und Apple, aber Windows (mein Betriebssystem ) Nur ist auch in Ordnung. CommandPrompt (mit Ausnahme der Liste der Befehle, die die IDES verwenden). Beim exportieren der Anwendung aus Eclipse als laufbares Glas und verdoppelt den .Jar passiert entweder nichts, oder es kommt zu einer "Java -Ausnahme hat RIP" -Fehler auftritt. Die einzige Möglichkeit, die Anwendung erfolgreich auszuführen, sind nicht sehr endgültig und sehen nicht so sauber aus, um wie alltägliche Apps zu laufen, was das Ziel ist. < /P>
Ich benutze in erster Linie Eclipse, aber auch intellij, um das Problem einzugrenzen. . > [*] Umgebungsvariablen < /li>
Java SDK -Ordner < /li>
< /ul>
< /li>
Erstellen der Projekte < /p>
In commandPrompt (funktioniert) < /p>
< /li>
In commandPrompt (zeigt anzeigt (zeigt Der .jar -Fehler) < /p>
< /li>
< /ul>
< /li>
Hergestellt von Intellij
Verwenden Sie App.bat -Datei (funktioniert) < /p>
< /li>
app.zip in app.jar und Laufen mit Java -Plattform SE (funktioniert nicht) < /p>
< /li>
< /> < /li>
< /ul>
< /li>
< /ul>
Vorbereitung < /h2>
Verwenden von Java 8. Heruntergeladen von java.com. Obwohl Java --version In CommandPrompt Java SE Runtime Environment erstellt 23.0.1+11-39
Umgebungsvariablen
"java_home" = "C: \ Programme \ java \ jdk-23" < /li>
"path_to_fx" = "C: \ Programme Dateien \ Java \ javafx-sdk-23.0.1 \ lib "< /li>
" path "=" c: \ Programme \ java \ jdk-23 \ bin "< /li>
[/list]
Java -Ordner (% Path_to_fx% verwendet die Umgebungsvariable)> anwenden < /p>
< /li>
RightClick -Projektordner> Build -Pfad> Build -Pfad konfigurieren> Entfernen "Javafx SDK" ( Es handelt sich um die falsche Javafx -Bibliothek)> Bibliothek hinzufügen> Benutzerbibliothek> Wählen Sie die heruntergeladene Javafx -Bibliothek aus (meine lautet "Javafx 23.0.1")> Bewerben> Bewerben und Schließen < /p>
< /li>
< /ol>
Verzeichnisbaum für nicht modulare < /p> zum Haupt -Java -Datei -Ordner der Hauptdatei.
< /li>
Typ Javac-Module-path "%path_to_fx%" --add-modules javafx.controls, javafx.fxml main.java < /code> < /code> < /p>
< /li>
Typ Java-Module-PADH "%path_to_fx%" --add-modules javafx.controls, javafx.fxml main < /code> < /p>
< /li>
Fehler erhalten: Fehler: Fehler oder laden Sie die Hauptklasse, die keine Hauptklasse finden oder laden konnte. /Main)
[*] nvm try Java main.java (funktioniert mit Standard -Java -Code, wenn nur JRE verwendet wird Bibliothek) < /p>
< /li>
Neuer Fehler erhalten: (kurz gehalten) < /p> Fehler ist unterschiedlich. Noch bereits genügend Details)
[/list]
[*] Modular - in commandPrompt. Verwirrender Befehl von Eclipse < /p>
Tun Sie dasselbe wie nicht modulare, aber winzige Änderungen: < /p>
[*] App läuft
[/list]
< /ul>
Intellij < /h3>
Ich benutze in erster Linie Eclipse, aber auch intellij, um das Problem einzugrenzen. . > [*] Umgebungsvariablen < /li>
Java SDK -Ordner < /li>
< /ul>
< /li>
Erstellen der Projekte < /p>
- Eclipse, modular und nicht modular < /li>
Intellij < /li>
< /ul >
< /li>
Ausführen der Projekt Nicht modular < /p>
In iDE (funktioniert) < /p>
< /li>
In CommandPrompt, kurze/einfache Befehle (funktioniert nicht) - In CommandPrompt, verwirrender Befehl, das von Eclipse (Works)
< /li>
< /ul>
< /li>
Intellij < /p>
(Das gleiche wie Eclipse) < /li>
< /ul>
< /li>
< /> < /li>
Exportieren /Bereitstellen der Projekte < /p>
Eclipse < /p>
< /li>
intellij
In commandPrompt (funktioniert) < /p>
< /li>
In commandPrompt (zeigt anzeigt (zeigt Der .jar -Fehler) < /p>
< /li>
< /ul>
< /li>
Hergestellt von Intellij
Verwenden Sie App.bat -Datei (funktioniert) < /p>
< /li>
app.zip in app.jar und Laufen mit Java -Plattform SE (funktioniert nicht) < /p>
< /li>
< /> < /li>
< /ul>
< /li>
< /ul>
Vorbereitung < /h2>
Verwenden von Java 8. Heruntergeladen von java.com. Obwohl Java --version In CommandPrompt Java SE Runtime Environment erstellt 23.0.1+11-39
Umgebungsvariablen
"java_home" = "C: \ Programme \ java \ jdk-23" < /li>
"path_to_fx" = "C: \ Programme Dateien \ Java \ javafx-sdk-23.0.1 \ lib "< /li>
" path "=" c: \ Programme \ java \ jdk-23 \ bin "< /li>
[/list]
Java -Ordner
Code: Select all
Java.
├───javafx-sdk-23.0.1
│ ├───bin
│ ├───legal
│ └───lib
├───jdk-23
│ ├───bin
│ ├───conf
│ ├───include
│ ├───jmods
│ ├───legal
│ └───lib
├───jre1.8.0_431
│ ├───bin
│ ├───legal
│ └───lib
├───latest
│ └───jre-1.8
│ ├───bin
│ ├───legal
│ └───lib
└───openjfx-23.0.1_windows-x64_bin-jmods
└───javafx-jmods-23.0.1
< /code>
Erstellen der Projekte < /h2>
Eclipse - Nicht modular < /h3>
[list]
Datei> Neu> Andere> Javafx-Projekt < /p>
< /li>
Geben Sie einen Namen> "Standard JRE '... "> Auswählen" Modul-info.java-Datei erstellen "oder erstellt sie trotzdem> FISSE < /P>
< /li>
Löschen Sie das" Modul- info.java "Datei> RightClick-Projektordner> Ausführen als> Konfigurationen ausführen> Argumente> In" VM Argumente "eingeben-Module-path"%path_to_fx%"--add-modules javafx.controls, javafx.fxml
< /li>
RightClick -Projektordner> Build -Pfad> Build -Pfad konfigurieren> Entfernen "Javafx SDK" ( Es handelt sich um die falsche Javafx -Bibliothek)> Bibliothek hinzufügen> Benutzerbibliothek> Wählen Sie die heruntergeladene Javafx -Bibliothek aus (meine lautet "Javafx 23.0.1")> Bewerben> Bewerben und Schließen < /p>
< /li>
< /ol>
Verzeichnisbaum für nicht modulare < /p>
Code: Select all
non_modular_test:.
│ .classpath
│ .project
│ build.fxbuild
│
├───.settings
│ org.eclipse.core.resources.prefs
│
├───bin
│ └───application
│ application.css
│ Main.class
│
└───src
└───application
application.css
Main.java
< /code>
Main.java Code < /p>
package application;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
< /code>
eclipse - modular < /h3>
Gleich wie Schritt 1-2 für nicht modular < /p>
< /li>
Gleich wie Schritt 4 für nicht modulare < /p>
< /li>
< /ol>
Verzeichnisbaum für modulare < /p>
modular_test:.
│ .classpath
│ .project
│ build.fxbuild
│
├───.settings
│ org.eclipse.core.resources.prefs
│
├───bin
│ │ module-info.class
│ │
│ └───application
│ application.css
│ Main.class
│
└───src
│ module-info.java
│
└───application
application.css
Main.class
Main.java
< /code>
Main.java Code < /p>
Same as non modular
IntelliJ
(home screen) New Project > JavaFX > Give a name > Just go with Maven > Select JDK > Next
[*]Select the libraries you want included (just for making the app run, i dont use any) > Create
[/list]
Directory tree for IntelliJ
demo:.
│ .gitignore
│ mvnw
│ mvnw.cmd
│ pom.xml
│
├───.idea
│ .gitignore
│ compiler.xml
│ encodings.xml
│ jarRepositories.xml
│ misc.xml
│ workspace.xml
│
├───.mvn
│ └───wrapper
│ maven-wrapper.jar
│ maven-wrapper.properties
│
├───src
│ └───main
│ ├───java
│ │ │ module-info.java
│ │ │
│ │ └───com
│ │ └───example
│ │ └───demo
│ │ HelloApplication.java
│ │ HelloController.java
│ │
│ └───resources
│ └───com
│ └───example
│ └───demo
│ hello-view.fxml
│
└───target
├───classes
│ │ module-info.class
│ │
│ └───com
│ └───example
│ └───demo
│ hello-view.fxml
│ HelloApplication.class
│ HelloController.class
│
└───generated-sources
└───annotations
< /code>
HelloApplication.java Code < /p>
package com.example.demo;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
< /code>
Ausführen der Projekte - nicht exportiert < /h1>
[b] Eclipse < /strong> < /h3>
[list]
[*] Nicht modular und modular - in ide < /p>
[list]
RightClick -Projektordner> Ausführen als> Java -Anwendung < /p>
< /li>
Wählen Sie die Haupt -Java -Datei> OK < /p>
< /li>
läuft ohne Schweiß < /p>
< /li>
< /ol>
< /li>
Nicht modular - in commandPrompt. Kurz-/einfache Befehle
Navigieren Sie in Befehlsprompt mit CD -Path \ to \ Datei
< /li>
Typ Javac-Module-path "%path_to_fx%" --add-modules javafx.controls, javafx.fxml main.java < /code> < /code> < /p>
< /li>
Typ Java-Module-PADH "%path_to_fx%" --add-modules javafx.controls, javafx.fxml main < /code> < /p>
< /li>
Fehler erhalten: Fehler: Fehler oder laden Sie die Hauptklasse, die keine Hauptklasse finden oder laden konnte. /Main)
[*] nvm try Java main.java (funktioniert mit Standard -Java -Code, wenn nur JRE verwendet wird Bibliothek) < /p>
< /li>
Neuer Fehler erhalten: (kurz gehalten) < /p>
Code: Select all
Main.java:3: error: package javafx.application does not exist
import javafx.application.Application;
^
Main.java:4: error: package javafx.stage does not exist
import javafx.stage.Stage;
^
< /code>
< /li>
< /ol>
Ein weiterer Fehler beim direkten Auftreten von Java (Modules Bla Bla) main.java < /Code>, aber es gibt bereits genügend Details < /li>
< /ul>
< /li>
Nicht modular - in commandPrompt. Verwirrender Befehl von Eclipse < /p>
Geben Sie den folgenden Befehl ein: < /p>
(Alles in 1 Befehl . /p>
"C:\Program Files\Java\jdk-23\bin\javaw.exe"
--module-path "%PATH_TO_FX%"
--add-modules javafx.controls,javafx.fxml
-p "C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.web.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx-swt.jar"
-classpath "C:\Users\[user]\eclipse-workspace\non_modular_test\bin" application.Main
< /code>
< /li>
App läuft (yay) < /p>
< /li>
< /ol>
< /li>
Modular - in commandPrompt. Kurz- /einfache Befehle < /p>
Wie nicht modular < /li>
< /ol>
< li> (außer Java (Module bla bla) main.java
[/list]
[*] Modular - in commandPrompt. Verwirrender Befehl von Eclipse < /p>
Tun Sie dasselbe wie nicht modulare, aber winzige Änderungen: < /p>
Code: Select all
"C:\Program Files\Java\jdk-23\bin\javaw.exe"
-p "C:\Users\[user]\eclipse-workspace\modular_test\bin;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx.web.jar;C:\Program Files\Java\javafx-sdk-23.0.1\lib\javafx-swt.jar"
-m modular_test/application.Main
[/list]
< /ul>
Intellij < /h3>
- In iDE < /p>
< ol>
Drücken Sie die Taste der Laufzeit < /p>
< /li>
Es wird < /p>
< /li ausgeführt >
< /ol>
< /li>
In commandPrompt, Short /Simple -Befehle < /p>- < li> gilt wie eclipse < /li>
< /ol>
< /li>
In CommandPrompt, verwirrender Befehl, das von Intellij < /p>
Geben Sie den folgenden Befehl in commandPrompt ein: < /p>
(Wieder alles in 1 Befehl. Mehrere Zeilen hier zur Lesbarkeit) < /p>
(Intellij verwendet auch einige UTF-8-Befehle, die nicht ausführen müssen) < /p>Code: Select all
"C:\Program Files\Java\jdk-23\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2024.3.1.1\lib\idea_rt.jar=52330:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2024.3.1.1\bin" -classpath "C:\Users\[user]\.m2\repository\org\openjfx\javafx-controls\17.0.6\javafx-controls-17.0.6.jar;C:\Users\[user]\.m2\repository\org\openjfx\javafx-graphics\17.0.6\javafx-graphics-17.0.6.jar;C:\Users\[user]\.m2\repository\org\openjfx\javafx-base\17.0.6\javafx-base-17.0.6.jar;C:\Users\[user]\.m2\repository\org\openjfx\javafx-fxml\17.0.6\javafx-fxml-17.0.6.jar" -p "C:\Users\[user]\.m2\repository\org\openjfx\javafx-controls\17.0.6\javafx-controls-17.0.6-win.jar;C:\Users\[user]\.m2\repository\org\openjfx\javafx-fxml\17.0.6\javafx-fxml-17.0.6-win.jar;C:\Users\[user]\IdeaProjects\demo2\target\classes;C:\Users\[user]\.m2\repository\org\openjfx\javafx-graphics\17.0.6\javafx-graphics-17.0.6-win.jar;C:\Users\[user]\.m2\repository\org\openjfx\javafx-base\17.0.6\javafx-base-17.0.6-win.jar" -m com.example.demo2/com.example.demo2.HelloApplication
- App läuft
Exportieren /Bereitstellen der Projekte < /h1>
Eclipse < /h3>- Rechtsklick -Projektordner oder klicken Projekt auswählen> Exportziel auswählen (as .jar - Durchsuchen Sie die Schaltfläche Mit .ZIP ASWELL)> Wählen Sie entweder extrahieren oder paket (sie sind unterschiedlich, wie später gezeigt)> FINISS
< /ol>
Als nicht modular ist eine Warnung über dem Exportmenü mit der Aufschrift: "VM -Argumente werden nicht Teil des Runnable -Glass sein. Argumente können weitergegeben werden Die Befehlszeile beim Starten des Glass ", obwohl diese Warnung praktisch keine Rolle spielt (siehe Kapitel über das Ausführen der Exporte) < /p>
Modular und nicht modular , extrahierte Bibliotheken [/b]
Code: Select all
extract:. ├───application │ ├───application.css │ └───Main.class ├───com │ └───sun ├───javafx │ ├───animation │ ├───application │ ├───beans │ ├───collections │ ├───concurrent │ ├───css │ ├───embed │ ├───event │ ├───fxml │ ├───geometry │ ├───print │ ├───scene │ ├───stage │ └───util └───META-INF └───substrate └───config < /code> Manifest.mf Manifest-Version: 1.0 Main-Class: application.Main Class-Path: . < /code> [list] [*] Modulare und nicht modulare, verpackte Bibliotheken < /strong> < /li> < /ul> Baum (wenig verkürzt). Non-Modular hat kein Modul-info.class < /p> modular_package:. │ javafx-swt.jar │ javafx.base.jar │ javafx.controls.jar │ javafx.fxml.jar │ javafx.graphics.jar │ javafx.media.jar │ javafx.swing.jar │ javafx.web.jar │ module-info.class │ ├───application │ application.css │ Main.class │ ├───META-INF │ MANIFEST.MF │ └───org └───eclipse < /code> Manifest.mf Manifest-Version: 1.0 Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader Rsrc-Class-Path: ./ javafx.base.jar javafx.controls.jar javafx.fxml.jar javafx.graphics.jar javafx.media.jar javafx.swing.jar javafx.web.jar ja vafx-swt.jar Rsrc-Main-Class: application.Main Class-Path: . < /code> Intellij < /h3> Kann Artefakte für .jar -Verpackungen nicht verwenden, cuz ist nur für JDK 8 < /p> < /li> Verpackung mit JLink < /p> DoubleClick Strg < /p < /p > < /li> Für Maven, ein mvn javafx eingeben: jLink < /code> < /p> < /li> Der Export ist der Ordner "Ziel" im Projekt [/list] [/list] Baum (verkürzt. Theres auch einen "app.zip", identisch mit App -Ordner, zeigt aber nicht im Baum an) < /p> target:. ├───app │ ├───bin │ │ ├───app (file) │ │ ├───app.bat │ │ ├───java.dll │ │ ├───java.exe │ │ ├───javaw.exe │ │ └───server │ │ └───jvm.dll │ ├───conf │ │ └───security │ │ └───policy │ │ ├───limited │ │ └───unlimited │ ├───legal │ │ ├───java.base │ │ ├───java.datatransfer │ │ ├───java.desktop │ │ ├───java.prefs │ │ ├───java.scripting │ │ ├───java.xml │ │ └───jdk.unsupported │ └───lib │ └───security ├───classes │ └───com │ └───example │ └───demo ├───generated-sources │ └───annotations └───maven-status └───maven-compiler-plugin └───compile └───default-compile < /code> app.bat @echo off set JLINK_VM_OPTIONS= set DIR=%~dp0 "%DIR%\java" %JLINK_VM_OPTIONS% -m com.example.demo/com.example.demo.HelloApplication %* < /code> Ausführen der exportierten /bereitgestellten Projekte < /h1> Mit Eclipse < /h3> [list] hergestellt [*] Rechtsklickend und Laufen mit Java (TM) Plattform SE. Modular und nicht modular ist das gleiche < /p> Extrahierte Bibliotheken: Java -Ausnahmefehler Popup < /p> < /li> Verpackte Bibliotheken: Nichts passiert < /p> < /li> < /ul> < /li> Ausführen in commandprompt (funktioniert für alle) < /p> Navigieren Sie zum Desktop -Ordner < /p> < /li> < li> Java-Module-path "%path_to_fx%eingeben" --add-modules javafx.controls, javafx.fxml -jar app.jar
- < li> gilt wie eclipse < /li>
- Es läuft fein < /p>
< /li>
< /ol>
Nur Problem ist Dieser BefehlStrompt muss geöffnet bleiben oder die Anwendung schließt damit < /li>
< /ul>
< /li>
In commandPrompt ausführen (Fehler, warum .jar funktioniert nicht). Modular und nicht modular ist immer noch gleich
Navigieren Sie zum Desktop -Ordner> Java -Jar App.jar < Br /> < /li>
Extrahierte Bibliotheken: < /p>Code: Select all
Error: JavaFX runtime components are missing, and are required to run this application < /code> < /li> Packaged Libraries: (Nur das unbenannte Modul ist unterschiedlich - Auch der Fehler wird verkürzt) < /p> [date of running] com.sun.javafx.application.PlatformImpl startup WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @[hexcode]' Graphics Device initialization failed for : d3d, sw Error initializing QuantumRenderer: no suitable pipeline found java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found Exception in thread "main" java.lang.reflect.InvocationTargetException Caused by: java.lang.RuntimeException: No toolkit found
- Durch app.bat -Datei < /p>
Navigieren Sie zur App.bat -Datei navigieren im Ordner "bin" < /p>
< /li>
DoubleClick Die Datei < /p>
< /li>
commandPrompt wird geöffnet, und die App wird fein ausgeführt. Dieser BefehlStrompt muss geöffnet bleiben, oder die Anwendung schließt damit < /p>
< /li>
rechts die Datei "App" und wird mit der Java -Plattform SE geöffnet, wird kurz geöffnet. CommandPrompt und nichts mehr passiert < /p>
< /li>
< /ul>
< /li>
Ordner "app.zip" ändern , zu "app.jar" und laufend < /p>
rechts den Ordner> mit> Java -Plattform SE < /p>
< /öffnen li>
Fehler erhalten: "Ungültig oder beschädigtes Jarfile" < /p>
< /li>
< /ol>
Gleiches Ergebnis, wenn Java -jar app.jar in commandPrompt