Java Programm veröffentlichen am Besten modular

Der_AltMann

Aktives Mitglied
Hallo,
Ich habe ein Javafx Programm entwickelt. Leider habe ich mir während der Entwicklung keine Gedanken gemacht, wie das Programm am Ende aus der IDE kommen soll und habe deshalb ein normales Projekt benutzt, ohne Maven oder Gradle.
Nun mache ich mir diese Gedanken 😀 Mein Programm sollte am Besten ohne Java JDK und Installation auf jeden Windows Rechner ausgeführt werden können.
Nach ein bisschen Recherchieren dachte ich es wäre das Beste auf ein modulares Maven Projekt umzusteigen, um dann am Ende mit Jlink ein Image zu haben, dass nicht so groß ist und überall ausgeführt werden kann.
Das Problem ist, dass ich mehrere externe Librarys benutze, die nicht modular sind(JNA,ini4J). So bekomme ich den Fehler :
Java:
Error: automatic module cannot be used with jlink
Ich habe gelesen, dass man diese Jars auch irgendwie modularisieren kann mit ModiTect, was ich leide nicht hinbekommen habe.
Was ist der Beste Weg dies zu erreichen?
 
Was hast du denn versucht? Auf den ersten Blick sieht das nach dem sinnvollsten Weg aus
Ich habe das in meine POM file eingefügt, woraufhin ich zu jeder Library eine module-info kreiert bekommen habe.
Java:
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.moditect/moditect-maven-plugin -->
    <dependency>
        <groupId>org.moditect</groupId>
        <artifactId>moditect-maven-plugin</artifactId>
        <version>1.0.0.RC1</version>
    </dependency>

    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>5.6.0</version>
    </dependency>
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna-platform</artifactId>
        <version>5.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.ini4j</groupId>
        <artifactId>ini4j</artifactId>
        <version>0.5.4</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11.0.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.moditect</groupId>
            <artifactId>moditect-maven-plugin</artifactId>
            <version>1.0.0.Beta2</version>
            <executions>
                <execution>
                    <id>generate-module-info</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate-module-info</goal>
                    </goals>
                    <configuration>
                        <modules>
                            <module>
                                <artifact>
                                    <groupId>org.ini4j</groupId>
                                    <artifactId>ini4j</artifactId>
                                    <version>0.5.4</version>
                                </artifact>
                            </module>
                            <module>
                                <artifact>
                                    <groupId>net.java.dev.jna</groupId>
                                    <artifactId>jna</artifactId>
                                    <version>5.6.0</version>
                                </artifact>
                            </module>
                            <module>
                                <artifact>
                                    <groupId>net.java.dev.jna</groupId>
                                    <artifactId>jna-platform</artifactId>
                                    <version>5.6.0</version>
                                </artifact>
                            </module>
                        </modules>

                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.5</version>
            <configuration>
                <release>11</release>
                <jlinkImageName>JEdit</jlinkImageName>
                <launcher>JEdit</launcher>
                <mainClass>JEdit/Main.MainClass</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
soweit ich das auf der git Seite von Moditect verstanden habe muss ich diese Dateien irgendwie zu den Jars hinzufügen. Leider habe ich dies nicht mehr geschafft
 
Also es funktioniert, die Konfiguration ist allerdings etwas ekelig, da modularisierte und nicht-modularisierte Jars gemischt sind.

Ich lad gleich mal ein Beispiel hoch.
 

Der Teil zum Bauen der nativen Applikation findet sich im Profile app. Die relevanten Teile sind oben in den Properties angelegt, außer denen muss man auch die Module moditect-maven-plugin anpassen (dort, wo aktuell nur ini4j "konfiguriert" wird). Ansonsten sollte man vermutlich nichts anpassen (müssen).


maven-dependency-plugin wird genutzt, um einmal alle Dependencies in den modules-Ordner zu kopieren. Ist dazu da, dass die schon modularisierten Jars dann dort liegen.

moditect-maven-plugin wird zuerst genutzt, um für alle nicht-modularisierten Jars eine module-info zu generieren. In dem Beispiel ist das der Einfachheit erstmal nur ini4j, wo auch nur der Name angegeben werden muss (da keinerlei Abhängigkeiten oä). Wichtig ist, dass der Name dem Automatic-Module-Name entsprechen sollte, damit Tools damit klar kommen. Dort muss man die genutzten, nicht-modularisierten Jars konfigurieren.

[CODE lang="xml" highlight="7"]<module>
<artifact>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
</artifact>
<moduleInfo>
<name>ini4j</name>
</moduleInfo>
</module>[/CODE]

Außerdem muss man das eigene Module dort angeben, da kann man einfach auf die bestehende module-info verweisen:
XML:
<module>
    <mainClass>${mainClass}</mainClass>
    <moduleInfoFile>${project.build.sourceDirectory}/module-info.java</moduleInfoFile>
</module>


Dann wird moditect-maven-plugin genutzt, um mit jlink ein runtime-image zu bauen. modulePath gibt den Pfad zum vorher gefüllten modules-Ordner an, modules gibt die "Hauptmodule" an, und launcher gibt die Konfiguration für das Starten des images an, name ist der Name des Startskripts, module das zum Starten genutzte Modul:

XML:
<modulePath>
    <path>${project.build.directory}/modules</path>
</modulePath>
<modules>
    <module>${moduleName}</module>
</modules>
<launcher>
    <name>${launcherName}</name>
    <module>${moduleName}</module>
</launcher>


jpackage-maven-plugin wird dann zum Bauen der nativen Application genutzt. name ist der Name der Application, module gibt das zu startende Modul und die Hauptklasse an, und runtimeimage verweist auf das im vorherigen Schritt generierte Runtime-Image. Anpassen muss man dort u.U. den type, je nachdem was genau rauskommen soll (kann's nur unter macOS testen, dort kommt eine direkt ausführbare app raus).

XML:
<name>${appName}</name>
<type>IMAGE</type>
<runtimeimage>${project.build.directory}/jlink-image</runtimeimage>
<module>${moduleName}/${mainClass}</module>
 

Der Teil zum Bauen der nativen Applikation findet sich im Profile app. Die relevanten Teile sind oben in den Properties angelegt, außer denen muss man auch die Module moditect-maven-plugin anpassen (dort, wo aktuell nur ini4j "konfiguriert" wird). Ansonsten sollte man vermutlich nichts anpassen (müssen).


maven-dependency-plugin wird genutzt, um einmal alle Dependencies in den modules-Ordner zu kopieren. Ist dazu da, dass die schon modularisierten Jars dann dort liegen.

moditect-maven-plugin wird zuerst genutzt, um für alle nicht-modularisierten Jars eine module-info zu generieren. In dem Beispiel ist das der Einfachheit erstmal nur ini4j, wo auch nur der Name angegeben werden muss (da keinerlei Abhängigkeiten oä). Wichtig ist, dass der Name dem Automatic-Module-Name entsprechen sollte, damit Tools damit klar kommen. Dort muss man die genutzten, nicht-modularisierten Jars konfigurieren.

[CODE lang="xml" highlight="7"]<module>
<artifact>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
</artifact>
<moduleInfo>
<name>ini4j</name>
</moduleInfo>
</module>[/CODE]

Außerdem muss man das eigene Module dort angeben, da kann man einfach auf die bestehende module-info verweisen:
XML:
<module>
    <mainClass>${mainClass}</mainClass>
    <moduleInfoFile>${project.build.sourceDirectory}/module-info.java</moduleInfoFile>
</module>


Dann wird moditect-maven-plugin genutzt, um mit jlink ein runtime-image zu bauen. modulePath gibt den Pfad zum vorher gefüllten modules-Ordner an, modules gibt die "Hauptmodule" an, und launcher gibt die Konfiguration für das Starten des images an, name ist der Name des Startskripts, module das zum Starten genutzte Modul:

XML:
<modulePath>
    <path>${project.build.directory}/modules</path>
</modulePath>
<modules>
    <module>${moduleName}</module>
</modules>
<launcher>
    <name>${launcherName}</name>
    <module>${moduleName}</module>
</launcher>


jpackage-maven-plugin wird dann zum Bauen der nativen Application genutzt. name ist der Name der Application, module gibt das zu startende Modul und die Hauptklasse an, und runtimeimage verweist auf das im vorherigen Schritt generierte Runtime-Image. Anpassen muss man dort u.U. den type, je nachdem was genau rauskommen soll (kann's nur unter macOS testen, dort kommt eine direkt ausführbare app raus).

XML:
<name>${appName}</name>
<type>IMAGE</type>
<runtimeimage>${project.build.directory}/jlink-image</runtimeimage>
<module>${moduleName}/${mainClass}</module>
Vielen Dank für deine Mühe, das weiß ich sehr zu schätzen 👍
Dein Projekt funktioniert bei mir wunderbar. Ich habe nun versucht die Änderungen in der pom file in mein Project zu übernehmen.
Das Ergebnis: Bei mir wird der modules Ordner erzeugt mit den JARs(mit module-info drin) was schon mal ein ziemlicher Fortschritt ist 🙂
Allerdings erhalte ich einen Fehler und das Image wird nicht vollständig erzeugt:
Java:
[INFO] --- moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) @ JEdit ---
[ERROR] Error: Error reading module: C:\Users\AltmannT\Desktop\JEdit\target\modules\jna-platform-5.6.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  19.282 s
[INFO] Finished at: 2021-01-08T21:01:47+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) on project JEdit: Execution create-runtime-image of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image failed: Execution of jlink failed -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) on project JEdit: Execution create-runtime-image of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image failed: Execution of jlink failed

Die JAR Datei liegt allerdings unter dem angezeigten Pfad.
Mir ist noch aufgefallen, dass ich in Eclipse ein Fehler im Projekt angezeigt bekomme, obwohl mir Eclipse keine Ursprungsklasse nennen kann
1610136657763.png
Das erzeugen einer normalen jar mit mvn clean package funktioniert aber
 
Hm, ja kann ich reproduzieren, der Fehler dürfte in moditect selbst liegen.

Als Workaround könnte man die module-info für jna-platform per Hand erstellen (bzw die generierte fixen), ich guck mal eben...
 
Vielleicht auch doch nicht, das müsste in moditect selbst gefixt werden :/

Wenn man rein lokal baut, kann man das relativ leicht fixen (wobei man dann uU in einen anderen Fehler läuft, für den gäb's aber 'nen Workaround).
 
Wobei, je nachdem was genau du aus jna-platform brauchst, ginge:

[CODE lang="xml" highlight="9,10"]<module>
<artifact>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</artifact>
<moduleInfo>
<name>com.sun.jna.platform</name>
<exports>
!com.sun.jna.platform.win32.COM*;
*;
</exports>
</moduleInfo>
</module>[/CODE]
 
Ich hatte vor ein paar Monaten UNGEFÄHR die gleiche Situation. Deswegen:

[CODE lang="xml" highlight="9,10"]<module>
<artifact>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</artifact>
<moduleInfo>
<name>com.sun.jna.platform</name>
<exports>
!com.sun.jna.platform.win32.COM*;
*;
</exports>
</moduleInfo>
</module>[/CODE]
--> Je nach dem...

Bei mir allerdings ohne das Sternchen o@
 
Wobei, je nachdem was genau du aus jna-platform brauchst, ginge:

[CODE lang="xml" highlight="9,10"]<module>
<artifact>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</artifact>
<moduleInfo>
<name>com.sun.jna.platform</name>
<exports>
!com.sun.jna.platform.win32.COM*;
*;
</exports>
</moduleInfo>
</module>[/CODE]
aus Jna-plattform benötige ich nur
Java:
import com.sun.jna.platform.win32.WinNT.HANDLE; und com.sun.jna.platform.win32.WinNT.HANDLEByReference;
wenn ich den Code zu der pom hinzufüge erhalte ich einen anderen Error und zwar:
Java:
[INFO] --- moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) @ JEdit ---
[ERROR] Error: Module null not found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  14.306 s
[INFO] Finished at: 2021-01-09T11:42:10+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) on project JEdit: Execution create-runtime-image of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image failed: Execution of jlink failed -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image (create-runtime-image) on project JEdit: Execution create-runtime-image of goal org.moditect:moditect-maven-plugin:1.0.0.RC1:create-runtime-image failed: Execution of jlink failed

Ich bin mir unsicher, was für ein Modul "null" hier nicht gefunden wird 😄
 
Was denn "je nach dem"?
Es war einfach nur eine Zustimmung zu dem was du vorher geschrieben hast:
je nachdem was genau du aus jna-platform brauchst, ginge:

In dem Fall (ohne das*;) wird nichts aus dem Modul exportiert und jeder Aufruf schlägt zur Laufzeit fehl.
Habe ich auch gedacht, aber bei mir ist es gerade andersherum. Mit dem *; bekomme ich erst recht Probleme! 😵

@Der_AltMann probiere einfach so mal aus Spaß was bei dir rauskommst wenn du das *; wegläßt. Ich würde gerne wissen, ob du die gleiche "Überraschung" bekommst...
 
Ich seh grad, du hast moditect auch als Dependency eingebunden, da muss das raus
Ne das habe ich schon rausgenommen 🤔 daran kann es nicht liegen. Ich habe die properties in der pom an die aus deinem Projekt angepasst(Ich dachte am Anfang nicht, dass das ein Unterschied machen würde...was es aber doch getan hat 😀) und nun bekomme ich den Fehler :
Java:
 Error: Error reading module: C:\Users\AltmannT\Desktop\JEdit\target\modules\JEdit-1.0.jar
was ja keine externe Library ist sondern mein Projekt.
Die Datei selbst existiert an dem angegebenen Pfad, und hat auch die module-info.class in sich.
meine gesamte pom:
Java:
<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>de.AlmannT</groupId>
    <artifactId>JEdit</artifactId>
    <version>1.0</version>
    
    


    <properties>
        <appName>JEdit</appName>
        <launcherName>JEdit</launcherName>
        <moduleName>JEdit</moduleName>
        <mainClass>JEdit/Main.MainClass</mainClass>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.java>11</version.java>
        <version.javafx>15</version.javafx>
    </properties>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.moditect/moditect-maven-plugin -->

        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>5.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.ini4j</groupId>
            <artifactId>ini4j</artifactId>
            <version>0.5.4</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11.0.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.5</version>
                <configuration>
                    <release>11</release>
                    <jlinkImageName>JEdit</jlinkImageName>
                    <launcher>JEdit</launcher>
                    <mainClass>JEdit/Main.MainClass</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>${version.java}</release>
                </configuration>
            </plugin>

        </plugins>
    </build>


    <profiles>
        <!-- Builds a modular runtime image -->
        <profile>
            <id>JEdit</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>3.1.2</version>
                        <executions>
                            <execution>
                                <id>copy-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <overWriteReleases>false</overWriteReleases>
                                    <overWriteSnapshots>false</overWriteSnapshots>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.moditect</groupId>
                        <artifactId>moditect-maven-plugin</artifactId>
                        <version>1.0.0.RC1</version>
                        <executions>
                            <execution>
                                <id>add-module-info-to-dependencies</id>
                                <phase>package</phase>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <overwriteExistingFiles>true</overwriteExistingFiles>
                                    <modules>
                                        <module>
                                            <artifact>
                                                <groupId>org.ini4j</groupId>
                                                <artifactId>ini4j</artifactId>
                                            </artifact>
                                            <moduleInfo>
                                                <name>ini4j</name>
                                            </moduleInfo>
                                        </module>
                                        <module>
                                            <artifact>
                                                <groupId>net.java.dev.jna</groupId>
                                                <artifactId>jna</artifactId>
                                            </artifact>
                                            <moduleInfo>
                                                <name>com.sun.jna</name>
                                            </moduleInfo>
                                        </module>
                                        <module>
                                            <artifact>
                                                <groupId>net.java.dev.jna</groupId>
                                                <artifactId>jna-platform</artifactId>
                                            </artifact>
                                            <moduleInfo>
                                                <name>com.sun.jna.platform</name>
                                                <exports>
                                                    !com.sun.jna.platform.win32.COM*;
                                                    *;
                                                    <!--com.sun.jna.platform.win32.WinNT.HANDLE;
                                                    com.sun.jna.platform.win32.WinNT.HANDLEByReference;-->
                                                </exports>
                                            </moduleInfo>
                                        </module>
                                    </modules>
                                    <module>
                                        <mainClass>${mainClass}</mainClass>
                                        <moduleInfoFile>${project.build.sourceDirectory}/module-info.java</moduleInfoFile>
                                    </module>
                                </configuration>
                                <goals>
                                    <goal>add-module-info</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>create-runtime-image</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>create-runtime-image</goal>
                                </goals>
                                <configuration>
                                    <modulePath>
                                        <path>${project.build.directory}/modules</path>
                                    </modulePath>
                                    <modules>
                                        <module>${moduleName}</module>
                                    </modules>
                                    <launcher>
                                        <name>${launcherName}</name>
                                        <module>${moduleName}</module>
                                    </launcher>
                                    <compression>2</compression>
                                    <stripDebug>true</stripDebug>
                                    <outputDirectory>${project.build.directory}/jlink-image</outputDirectory>
                                </configuration>
                            </execution>

                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>com.github.akman</groupId>
                        <artifactId>jpackage-maven-plugin</artifactId>
                        <version>0.1.2</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jpackage</goal>
                                </goals>
                                <configuration>
                                    <name>${appName}</name>
                                    <type>IMAGE</type>
                                    <runtimeimage>${project.build.directory}/jlink-image</runtimeimage>
                                    <module>${moduleName}/${mainClass}</module>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

@Noahscript ich habe es schon probiert wegzulassen, es hat jedoch keinen Unterschied gemacht bei mir. Trotzdem danke für den Tipp
 
Lösung: das Package, in dem die mainClass ist muss den gleichen Namen haben, wie der ModulName. Das war mir nicht ganz klar. Jetzt funktioniert es 👍
 
Lösung: das Package, in dem die mainClass ist muss den gleichen Namen haben, wie der ModulName. Das war mir nicht ganz klar.
Das war dir vermutlich deshalb nicht klar, weil es nicht so ist 🙂 Zwischen Package- und Modul-Name besteht kein direkter Zusammenhang, die können völlig frei und unabhängig gewählt werden.

Üblich ist es nur, package, module und groupId & artifactId passend zueinander zu wählen.
 
Hey Leute , ich wollte ebenso eine JavaFx Anwendung auf alle Windwowssysteme laufen lassen.
Das ganze realsiere ich mit Maven. Meine Pom.datei isz folgende
Sowas mache ich zum ersten mal und habe da wirklich gar keine Ahnung von.. Maven ist mir ebenfalss recht neu , könnte mir jmd vlt sagen was genau ich einbinden muss und am besten wie ? vlt @mrBrown ?
Also mein Ziel ist es die Anwendung starten zu können , ohne ejdes mal Intellij zu starten auf run zu klicken, also ne richtige Anwendung.


XML:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>EinkaufslisteGUI</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>EinkaufslisteGUI</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.7.1</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
        </dependency>



        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>16</source>
                    <target>16</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.7</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.example.einkaufslistegui/com.example.einkaufslistegui.MainProgramm
                            </mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
 
javafx maven plugin und jpackage sind deine Freunde oder

launch4j
 
javafx maven plugin und jpackage sind deine Freunde oder

launch4j
erstmal danke für den Link , aber wie egsagt ich kenne mich damit wirklich aus und von jpackage habe ich auch noch nie was gehört @Joreyk
 
das ist mein ding was ich zum ausspucken für installations dateien benutze

XML:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>FinalGame5</groupId>
    <artifactId>NEXcg2</artifactId>
    <version>0.0.1</version>
    <repositories>
        <repository>
            <id>github</id>
            <name>GitHub yfons Apache Maven Packages</name>
            <url>https://maven.pkg.github.com/yfons/RapidFXorg</url>
        </repository>
    </repositories>
    <properties>
        <!-- Application Properties -->
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <main.module>finalGame1</main.module>
        <maven.dependency.plugin>3.1.2</maven.dependency.plugin>
        <main.class>application.Main</main.class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <main.class>application.Main</main.class>
        <!-- Dependency Versions -->
        <java.version>16</java.version>
        <javafx.version>${java.version}</javafx.version>
        <jpackage.maven.plugin>1.4.0</jpackage.maven.plugin>
        <javafx-maven-plugin>0.0.5</javafx-maven-plugin>
    </properties>

    <build>

        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
            <!--<resource> <directory>${basedir}/src/main/java/com/test/customize</directory>
                <filtering>false</filtering> </resource> <resource> <directory>${basedir}/src/main/java/com/test/resources</directory>
                <filtering>false</filtering> </resource> <resource> <directory>${basedir}/src/main/java/com/test/xml</directory>
                <filtering>false</filtering> </resource> -->
        </resources>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx-maven-plugin}</version>

                <configuration>
                    <compress>2</compress>
                    <noHeaderFiles>true</noHeaderFiles>
                    <stripDebug>true</stripDebug>
                    <noManPages>true</noManPages>
                    <launcher>NEXcg</launcher>
                    <mainClass>${main.class}</mainClass>
                    <jlinkImageName>${main.module}</jlinkImageName>
                    <!-- <jlinkZipName>${main.module}</jlinkZipName> -->

                </configuration>
                <executions>
                    <execution>
                        <id>javafx-installer</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jlink</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.panteleyev</groupId>
                <artifactId>jpackage-maven-plugin</artifactId>
                <version>${jpackage.maven.plugin}</version>
                <executions>
                    <execution>
                        <id>jpackage-installer</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jpackage</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>

                    <name>${project.artifactId}</name>
                    <appVersion>${project.version}</appVersion>
                    <!-- <vendor>me</vendor> -->
                    <destination>target/jpackageInstaller</destination>
                    <module>${main.module}/${main.class}</module>
                    <!-- <icon>${project.basedir}</icon> -->

                    <runtimeImage>target/${main.module}</runtimeImage>

                    <!-- Parameter for Windows Installer -->
                    <winConsole>true</winConsole>
                    <winDirChooser>true</winDirChooser>
                    <winMenu>true</winMenu>
                    <winMenuGroup>true</winMenuGroup>
                    <winShortcut>true</winShortcut>

                    <!-- Parameter for Linux Installer -->
                    <linuxShortcut>true</linuxShortcut>
                    <linuxPackageName>nex</linuxPackageName>
                    <linuxAppCategory>Utilities</linuxAppCategory>
                    <linuxMenuGroup>Utilities</linuxMenuGroup>


                    <!-- Parameter for Mac Installer -->
                    <macPackageName>nex</macPackageName>
                    <macSign>true</macSign>
                    <!-- <icon>${project.basedir}/draco.png</icon> -->
                    <javaOptions>
                        <option>-Dfile.encoding=${project.build.sourceEncoding}</option>
                    </javaOptions>

                </configuration>


            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>16</release>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-web -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>${javafx.version}</version>
        </dependency>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.36.0.3</version>
</dependency>

        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.70.Final</version>
        </dependency>
        <dependency>
            <groupId>rapidfxcore</groupId>
            <artifactId>de.github.yfons.rapidfx</artifactId>
            <version>1.114.659-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
da ich auch nicht wirklich ein profi bin mit maven kann ich dir nicht alles erklären... vllt kriegst du es hin das so umzubauen dass es bei dir auch funktioniert ?
ich weis aber dass du auf deinem lokalen pc maven mit java installieren musst weil das ding in IDEs einen Bug auslöst, der sowohl in eclipse als wie auch in intellij existiert
das mit repositories und de.github.yfons.rapidfx brauchst du NICHT ... das ist von mir ein github repository
 
Also mein Intellij ist mit Maven verbundne udn die JavaFx anwendung ist auch mit Maven gemacht worden
schon mal danke dafür vlt kriege ich das ja iwie hin.. ich hoffe es😀 weil ich halt wie gesagt davon echt keineahnung habe
 
das maven compiler plugin => kannst du so lassen wie es ist
maven dependency plugin => kannst du so lassen wie es ist ... vllt brauchst du es auch gar nicht... weis nimmer ob ich das für die exe gebraucht hab oder für das repository

jpackage maven plugin => macht die exe vorbereitung ( so weit ich es verstanden habe? ) ... jpackage liefert dir immer den installer auf dem Betriebssystem wo du im moment drauf bist
das javafx maven plugin => nimmt den jpackage launcher und macht nochmal was damit dass die javafx runtime dabei ist... ( glaub ich)
 
Also mein Intellij ist mit Maven verbundne udn die JavaFx anwendung ist auch mit Maven gemacht worden
schon mal danke dafür vlt kriege ich das ja iwie hin.. ich hoffe es😀 weil ich halt wie gesagt davon echt keineahnung habe
ja aber wenn du mit meinem ding mvn clean install aufrufst, bekommst du einen fehler der nicht lösbar ist

wenn du mvn clean install in der konsole bzw terminal deines betriebssystemes aufrufst ist der fehler weg... das ist aber ein bug der seit 4 jahren oder 5 jahren shcon da ist, zumindest in eclipse

der stackoverflow thread den ich gelesen hatte hat auch geschrieben dass in intellij auch so einen fehler gibt aber kann ich nicht bestätigen, ich benutze kein intellij
 
das ist mein ding was ich zum ausspucken für installations dateien benutze

XML:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>FinalGame5</groupId>
    <artifactId>NEXcg2</artifactId>
    <version>0.0.1</version>
    <repositories>
        <repository>
            <id>github</id>
            <name>GitHub yfons Apache Maven Packages</name>
            <url>https://maven.pkg.github.com/yfons/RapidFXorg</url>
        </repository>
    </repositories>
    <properties>
        <!-- Application Properties -->
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <main.module>finalGame1</main.module>
        <maven.dependency.plugin>3.1.2</maven.dependency.plugin>
        <main.class>application.Main</main.class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <main.class>application.Main</main.class>
        <!-- Dependency Versions -->
        <java.version>16</java.version>
        <javafx.version>${java.version}</javafx.version>
        <jpackage.maven.plugin>1.4.0</jpackage.maven.plugin>
        <javafx-maven-plugin>0.0.5</javafx-maven-plugin>
    </properties>

    <build>

        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
            <!--<resource> <directory>${basedir}/src/main/java/com/test/customize</directory>
                <filtering>false</filtering> </resource> <resource> <directory>${basedir}/src/main/java/com/test/resources</directory>
                <filtering>false</filtering> </resource> <resource> <directory>${basedir}/src/main/java/com/test/xml</directory>
                <filtering>false</filtering> </resource> -->
        </resources>
        <plugins>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx-maven-plugin}</version>

                <configuration>
                    <compress>2</compress>
                    <noHeaderFiles>true</noHeaderFiles>
                    <stripDebug>true</stripDebug>
                    <noManPages>true</noManPages>
                    <launcher>NEXcg</launcher>
                    <mainClass>${main.class}</mainClass>
                    <jlinkImageName>${main.module}</jlinkImageName>
                    <!-- <jlinkZipName>${main.module}</jlinkZipName> -->

                </configuration>
                <executions>
                    <execution>
                        <id>javafx-installer</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jlink</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.panteleyev</groupId>
                <artifactId>jpackage-maven-plugin</artifactId>
                <version>${jpackage.maven.plugin}</version>
                <executions>
                    <execution>
                        <id>jpackage-installer</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jpackage</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>

                    <name>${project.artifactId}</name>
                    <appVersion>${project.version}</appVersion>
                    <!-- <vendor>me</vendor> -->
                    <destination>target/jpackageInstaller</destination>
                    <module>${main.module}/${main.class}</module>
                    <!-- <icon>${project.basedir}</icon> -->

                    <runtimeImage>target/${main.module}</runtimeImage>

                    <!-- Parameter for Windows Installer -->
                    <winConsole>true</winConsole>
                    <winDirChooser>true</winDirChooser>
                    <winMenu>true</winMenu>
                    <winMenuGroup>true</winMenuGroup>
                    <winShortcut>true</winShortcut>

                    <!-- Parameter for Linux Installer -->
                    <linuxShortcut>true</linuxShortcut>
                    <linuxPackageName>nex</linuxPackageName>
                    <linuxAppCategory>Utilities</linuxAppCategory>
                    <linuxMenuGroup>Utilities</linuxMenuGroup>


                    <!-- Parameter for Mac Installer -->
                    <macPackageName>nex</macPackageName>
                    <macSign>true</macSign>
                    <!-- <icon>${project.basedir}/draco.png</icon> -->
                    <javaOptions>
                        <option>-Dfile.encoding=${project.build.sourceEncoding}</option>
                    </javaOptions>

                </configuration>


            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>16</release>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-web -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>${javafx.version}</version>
        </dependency>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.36.0.3</version>
</dependency>

        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.70.Final</version>
        </dependency>
        <dependency>
            <groupId>rapidfxcore</groupId>
            <artifactId>de.github.yfons.rapidfx</artifactId>
            <version>1.114.659-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
da ich auch nicht wirklich ein profi bin mit maven kann ich dir nicht alles erklären... vllt kriegst du es hin das so umzubauen dass es bei dir auch funktioniert ?
ich weis aber dass du auf deinem lokalen pc maven mit java installieren musst weil das ding in IDEs einen Bug auslöst, der sowohl in eclipse als wie auch in intellij existiert
das mit repositories und de.github.yfons.rapidfx brauchst du NICHT ... das ist von mir ein github repository
und wie startest du dan ndie Anwenng ?
 
aber wie gesagt, das extra repository bruachst du nicht, und das rapidfxcore auch nicht, wirst sowieso dann in einen authentifizierungs fehler rein kommen weil mein github nenn token braucht( weil ich es nicht geschafft hab das auszuschalten 🙁 )
 
aber wie gesagt, das extra repository bruachst du nicht, und das rapidfxcore auch nicht, wirst sowieso dann in einen authentifizierungs fehler rein kommen weil mein github nenn token braucht( weil ich es nicht geschafft hab das auszuschalten 🙁 )
ich versuche das morgen mal und meld mich dann .. hoffe das ich das iwie hinbekomme danke dir
 
und wie startest du dan ndie Anwenng ?
naja in dem pfadddddddddd /target/jpackageinstaller liegt dann eine exe datei... darauf doppel klick ...und tada es erstellt eine exe datei mit allen einträgen im betriebssystem und windows findets auch wenn du auf windows suchst... also ist ein programm installer wie man ihn so findet

halt auf linux wirds eine .deb datei
auf windows eine .exe
und mac interessiert mich nicht aber da sollte auch irgendwas raus kommen
 
das sdependency kopiert irgendwas rüber was du dann später fürs jpackage brauchst, also das darfst net löschen
 

Zurück
Oben