Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen

Hallo zusammen,

ich bin Java Anfänger und programmiere auf einem MacBook mit Ventura 13.0.1 als Betriebssystem mit NetBeans 16.

Ich habe die JRE und das JDK installiert und habe jetzt in NetBeans folgenden Programmcode für eine erste einfache GUI Oberfläche (Projektname ist GUIAnwendung) geschrieben.

Bildschirmfoto 2023-01-16 um 17.00.19.png
Wenn ich das Projekt dann in NetBeans kompiliere sieht der Ordner im NetBeans Verzeichnis im Finder folgendermaßen aus:
Bildschirmfoto 2023-01-16 um 16.53.57.png
Der target Ordner sieht dann folgendermaßen aus:
Bildschirmfoto 2023-01-16 um 16.54.16.png



Die pom.xml Datei habe ich folgendermaßen angepasst:

Bildschirmfoto 2023-01-16 um 16.59.39.png
Wenn ich die jar. Datei GUIAnwendung-1.0-SNAPSHOT.jar dann über das Terminal öffnen will, dann wird mir folgende Fehlermeldung angezeigt.
Bildschirm­foto 2023-01-16 um 16.53.27.png
Die jar. Datei lässt sich also nicht öffnen. Durch einen Doppelklick im Finder Fenster lässt sie sich ebenfalls nicht öffnen.

Wo liegt mein Fehler. Bin über jede Hilfe dankbar.

Viele Grüße
 

Anhänge

  • Bildschirm­foto 2023-01-16 um 17.00.19.png
    Bildschirm­foto 2023-01-16 um 17.00.19.png
    306,3 KB · Aufrufe: 2
Man erstellt keien jar Files mehr, die so gestartet werden.

Du nutzt das jafacx plugin von openjfx - da solltest Du dann mal das maven Tiel javafx:jlink aufrufen - dann wird ein sogenanntes Images erstellt, das Du dann auch starten kannst.
 
Guten Tag Konrad,

danke für deine Antwort. Wie gesagt, ich bin Anfänger und mein Programmcode stammt aus dem Lehrbuch "Java Programmieren lernen für Einsteiger" aus dem BMU Verlag und ich bin nach diesem vorgegangen. Wie rufe ich denn das maven Tiel javafix:jlink auf und wie kann ich dadurch dann das Image erstellen?

Danke für deine Mühe!
 
Ich kenne mich mit Netbeans nicht wirklich aus. Was ich auf die Schnelle eben gesehen habe: Rechtsclick auf die pom.xml in NetBeans hat ein Run Maven -> Goals... Menüpunkt. Da kommt dann ein Fenster bei dem man ein goal eingeben kann (sprich: Das javafx:jlink)

Da könnte man auch einmal ein wrapper:wrapper ziel durchlaufen lassen, um dann auf der KOmmandozeile das auch aufrufen zu können. Dann wäre es möglich, im Terminal Fenster in das Verzeichnis des Projektes zu gehen um da dann
./mvnw javafx:jlink
laufen zu lassen.
 
Hallo M.L., hallo Konrad,

wenn ich in NetMeans mit der rechten Maustaste über den Projektnamen gehe und auf "Run Maven" gehe, dann steht dort lediglich Goals als Option und nicht "jlink".

Bildschirm­foto 2023-01-16 um 19.43.47.png

Wenn ich dann "Goals" wähle und dort dann unter Goals javafx:jlink eingebe...

Bildschirm­foto 2023-01-16 um 19.44.10.png

... dann kommt folgende Fehlermeldung (siehe die folgenden beiden Bilder):

Bildschirm­foto 2023-01-16 um 19.45.04.png
Bildschirm­foto 2023-01-16 um 19.45.12.png

Wo liegt mein Fehler. Muss ich noch etwas anderes machen? Danke für eure Hilfe und Mühe.

VG
 
Die Fehlermeldung besagt, dass Dir eine Modulbeschreibung fehlt. Alle Module - und damit auch Dein Code - brauchen eine Modulbeschreibung, damit JLink das Image bauen kann.

Die Modulbeschreibung ist die module-info.java Datei, die neben dem Namen der Datei auch angibt, welche Module benötigt werden und was dein Modul nach außen bereit stellt.
 
Direkt im default package eine module-info.java.
Die Klasse Hauptfenster muss in ein package (Klassen von Modulen dürfen nicht im default package sein).

Das Projekt sieht so aus, als ob da noch nicht wirklich etwas programmiert wurde. Evtl. willst Du einfach mal von https://github.com/kneitzel/JavaFXMavenApp das Projekt als ZIP laden, entpacken und mit dem Projekt arbeiten?

Da hast du dann einiges mehr schon drin, das hilfreich sein kann.
 
Hallo zusammen,

noch einmal zurück zu meiner Ausgangsfrage oben. Warum lässt sich die jar Datei nicht öffnen? Weder über Terminal, noch über Doppelklick. Hat da jemand eine Ahnung bzw. erkennt anhand des Codes, der Bilder einen Fehler? Ich würde gerne „Stück für Stück“ Java verstehen und daher auch dieses „Problem“.

Vielen Dank für eure Mühe
 
Warum lässt sich die jar Datei nicht öffnen?
Die jar Datei lässt sich öffnen. Nur eben lässt sich diese nicht starten, da diese kein Hauptmanifest mit Angabe der zu startenden Klasse enthält.

Starten ließe sich so eine jar z.B. per
java -cp GUIAnwendung-1.0-SNAPSHOT.jar Hauptfenster
Aber da würden dann die JavaFX Abhängigkeiten fehlen - es sei denn, du hättest ein Java Installiert, dass das JavaFX schon mit enthält.
 
Vorab: der fehlende Eintrag wg. "jlink" könnte unter NetBeans entstehen, wenn man das Projekt als "gewöhnliches" Java-Projekt anlegt (und nicht über die Vorgabe geht:
NB_JavaFX_Vorgabe.png)

Der Java-Compiler erwartet formelle Mindestanforderungen, z.B. zur jeweiligen Hauptklasse passende Dateinamen, eine "static void main"-Methode, Datentypsicherheit, alle Variablen/Methoden/... sind innerhalb wenigstens einer Klasse zu definieren,...

Längerfristig sollte man (häufige(re)) Änderungen/Erweiterungen/.. des Codes (an zentraler Stelle) einplanen (kurz: die Teile zusammenfügen, die sich selten(er) ändern, die Teile -geeignet- auslagern, die sich (häufig(er)) ändern könn(t)en). Am Anfang sollte man aber auch "Lösungen mit Zettel und Stift" und optisch weniger ansprechende Grundlagen (z.B. Konsolenanwendungen) einplanen.

Die JavaFX-Vorgabe von NetBeans (oder die JavaFXApp) erfüllen die formellen Kriterien:
Java:
...
public class App extends Application {  //--> Dateiname: App.java

    @Override
    public void start(Stage stage) {
        var javaVersion = SystemInfo.javaVersion(); // --> SystemInfo.java  (ausgelagert, um Änderungen zu erleichtern)
        var javafxVersion = SystemInfo.javafxVersion(); // --> statt "var" ginge auch (das weniger flexible) "String"
...
         }

    public static void main(String[] args) {  // --> main-Methode dient nur zum Starten des Programms
        launch();
    }
...
 
Das fehlende jlink dort ist aber unkritisch, denn man kann problemlos über Goals... das javafx:jlink auswählen.

Es ist halt ein einfaches maven Projekt das dem Vorgehen der Getting Started Dokumentation entspricht:

Nur eben muss man im Projekt den Anforderungen genügen, die eben Java bzw. die Tools des JDK haben. So wird hakt jlink aufgerufen und das hat gewisse Anforderungen (Halt das es keine unbenannten Module gibt).

Bezüglich Modulsystem gibt es eine alte Seite, die das erklärt:
 
Hallo zusammen,

wenn ich im Terminal den von Konrad genannten Befehl eingebe, dann kommt folgende Fehlermeldung:

Bildschirm­foto 2023-01-17 um 09.46.02.png

Meine Frage ist, wie im ersten Post ja bereits geschrieben, warum lässt sich diese jar. Datei nicht starten und das darin enthaltene GUI öffnen. Und warum funktioniert der Code in NetBeans, wenn ich auf Run gehe öffnet sich das GUI, aber nicht außerhalb der Entwicklungsumgebung.

Konrad schreibt, dass meine Java Umgebung JavaFX enthalten muss. Ich habe JavaFX nicht auf meinem Rechner installiert. Allerdings sagt das Lehrbuch, an dem ich mich orientiert habe, dass die JAVAFx Bibliotheken dem Projekt nicht manuell hinzugefügt werden müssen. Stattdessen wurde, so habe ich es gedeutet, die pom Datei so angepasst, dass die entsprechenden Bibliotheken automatisch aus dem Internet geladen werden.

Ich stehe wirklich auf dem Schlauch, ich bin exakt nach Lehrbuch vorgegangen und bekomme die einfache GUI Anwendung außerhalb von NetBeans auf meinem MacBook nicht gestartet. Im Folgenden sind jetzt einmal die Seiten für diese GUI Übungsaufgabe eingescannt. Vielleicht kann ja einer mal drüber schauen, ob im Lehrbuch eventuelle ein Fehler ist und mir einen Tip geben, was ich falsch mache.


Bildschirm­foto 2023-01-17 um 11.31.16.png
Bildschirm­foto 2023-01-17 um 11.31.30.png
Bildschirm­foto 2023-01-17 um 11.31.50.png
Bildschirm­foto 2023-01-17 um 11.32.04.png
Bildschirm­foto 2023-01-17 um 11.32.17.png
Bildschirm­foto 2023-01-17 um 11.32.32.png


Bildschirm­foto 2023-01-17 um 11.32.43.pngBildschirm­foto 2023-01-17 um 11.32.57.png
Bildschirm­foto 2023-01-17 um 11.33.09.png
Ich bin wirklich über jede Hilfe dankbar. Wie gesagt, ich bin Anfänger und mir fehlt Hintergrundwissen.

VG und danke für die Mühe

Stefan
 
Das ist dann das Problem, das ich schon vorhergesagt habe: Die JavaFX Abhängigkeit ist nicht vorhanden.

Und die Anleitung umfasst erst einmal nur, wie Du es in der IDE starten kannst. Evtl. kommt ja im weiteren Verlauf noch mehr bei dem Tutorial.
 
Hallo Konrad, hallo zusammen,

ich habe das Buch einmal weiter "vorgelesen" und ein "Einbinden" von JavaFX bzw. wie man die jar.Dateien starten kann, ist nicht enthalten. Ich habe mittlerweile in Foren auch gelesen, dass das Image Erstellen mittels jlink wohl die gängige Methode derzeit ist.

Dennoch würde ich es, zum Verständnis, gerne schaffen, diese jar.Datei auf meinem MacBook zum Starten zu bringen.

Hast du bzw. hat jemand anderes eine gute Anleitung (am liebsten auf Deutsch), in der beschrieben ist, wie man JavaFX auf einem MacBook installiert und halt auch die von dir beschriebene JavaFX Abhängigkeit bei der Datei herstellt?

Bin über jede Hilfe dankbar.

VG
 
Nur falls es noch nicht deutlich war: Ich halte Dein Vorgehen für kontraproduktiv. Ausführbare jar Dateien sind Stand Java 8 und heute nicht mehr zeitgemäß. Dabei hast Du einfach zu viele Folgeprobleme.

Aber wenn Du das machen willst, dann brauchst Du mindestens zwei Dinge - vermutlich aber drei:

1. Manifest. Das kannst Du über das maven-jar-plugin erstellen lassen.
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>Hauptfenster</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
Noch einmal prüfen, ob ich die Klasse richtig im Kopf hatte!

2. Abhängigkeiten - Du willst ein sogenanntes "fat jar" haben, also ein jar file, das auch alle Abhängigkeiten enthält. Das kann man mit dem maven-shade-plugin bekommen.
XML:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>

3. Dann gibt es einen Problem bei JavaFX und dem Vorgehen, wie der Classloader Klassen lädt. Das führt zu problemen, wenn die Klasse mit der main Methode von Application erbt. Mache daher einfach eine weite Klasse Main:
Java:
public class Main {
    public static void main (String[] args) {
        Hauptfenster.main(args);
    }
}
und dann ändere die mainClass von Hauptfenster zu Main wo dieses angegeben war.

Dann mach ein package oder install lauf (Also rechtsklick auf pom.xml > Goals... > package

Dabei wird dann in target eine jar Datei erstellt, die Du
  • per java -jar starten kannst
  • per Doppelclick starten kannst.

Diese jar ist aber Plattform spezifisch. Und ich hoffe, dass dies funktioniert. Das Problem kann hier noch sein, dass die Abhängigkeiten nicht richtig in der jar landen, denn die Abhängigkeiten sind etwas speziell bei JavaFX.

Es gibt die normale .jar - das sind nur Dummy jars
Dann gibt es *-windows.jar und so. Also für die großen Plattformen jeweils. Und Du brauchst da natürlich die richtige für Deine Plattform. Ich meine, dass die richtige von Maven auch mit kopiert werden sollte. Aber ich habe es nie ausprobiert.
 
Unabhängig vom Build System gibt es im Java Framework ab Java 9 das Tool JLink und ab Java 14 JPackage.

JLink erstellt ein sogenanntes Image. Das umfasst eine abgespeckte Java Version (nur die notwendigen Module) und alle Abhängigkeiten. Alles in einer Verzeichnisstruktur und - so man es angibt - incl. Startscript.

JPackage kann aus dem Image, das JLink erstellt hat, entweder:
  • Ein Paket zur Installation bauen
  • ein App-Image bauen. Ein AppImage ist ähnlich zu dem Image von JLink nur wird hier die Applikation über ein Binary gestartet. (Dies ist z.B. wichtig, da z.B. macOS dem ja Rechte geben will. Bei einem Script kann es schon mal problematisch sein.

Eine andere Alternative könnte die Verwendung von GraalVM sein. Das ist eine spezielle Java Umgebung, die auch ein native Tool hat. Damit kann man eine native Applikation erzeugen. Diese hat aber dann gewisse Einschränkungen bezüglich Classloader und Reflection.

Ich habe beider bei einer Konsolenanwendung mal als Projekt aufgestellt: https://github.com/kneitzel/JavaMavenApp

Bei JavaFX habe ich auch ein ähnliches Projekt aufgestellt - nur eben da derzeit noch ohne GraalVM. Das habe ich auf die Schnelle nicht zum laufen bekommen, daher hinkt das etwass hinterher: https://github.com/kneitzel/JavaFXMavenApp

Hier ist aber eines ganz wichtig: Für jede Plattform muss man ein Build durchführen. Also auf dem Mac erzeugt man nur die Mac Binaries. Auf Windows die für WIndows und auf Linux die für Linux. Da hilft es, wenn man ein Projekt auf einer CI/CD Platform hostet, die alles drei bietet.
 

Zurück
Oben