# Java Programm veröffentlichen am Besten modular



## Der_AltMann (8. Jan 2021)

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 : 
	
	
	
	





```
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?


----------



## mrBrown (8. Jan 2021)

Der_AltMann hat gesagt.:


> Ich habe gelesen, dass man diese Jars auch irgendwie modularisieren kann mit ModiTect, was ich leide nicht hinbekommen habe.


Was hast du denn versucht? Auf den ersten Blick sieht das nach dem sinnvollsten Weg aus


----------



## Der_AltMann (8. Jan 2021)

mrBrown hat gesagt.:


> 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.

```
<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


----------



## mrBrown (8. Jan 2021)

Also es funktioniert, die Konfiguration ist allerdings etwas ekelig, da modularisierte und nicht-modularisierte Jars gemischt sind.

Ich lad gleich mal ein Beispiel hoch.


----------



## mrBrown (8. Jan 2021)

Mr. Brown / jpackage-demo · GitLab
					

GitLab.com




					gitlab.com
				




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:

```
<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:


```
<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).


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


----------



## Der_AltMann (8. Jan 2021)

mrBrown hat gesagt.:


> Mr. Brown / jpackage-demo · GitLab
> 
> 
> GitLab.com
> ...


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:

```
[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

Das erzeugen einer normalen jar mit mvn clean package funktioniert aber


----------



## mrBrown (8. Jan 2021)

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...


----------



## mrBrown (8. Jan 2021)

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).


----------



## mrBrown (8. Jan 2021)

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]


----------



## Noahscript (9. Jan 2021)

Ich hatte vor ein paar Monaten UNGEFÄHR die gleiche Situation. Deswegen:



mrBrown hat gesagt.:


> [CODE lang="xml" highlight="9,10"]<module>
> <artifact>
> <groupId>net.java.dev.jna</groupId>
> <artifactId>jna-platform</artifactId>
> ...


--> Je nach dem...

Bei mir allerdings ohne das Sternchen o@


----------



## mrBrown (9. Jan 2021)

Noahscript hat gesagt.:


> --> Je nach dem...


Was denn "je nach dem"?



Noahscript hat gesagt.:


> Bei mir allerdings ohne das Sternchen o@


In dem Fall (ohne das`*;`) wird nichts aus dem Modul exportiert und jeder Aufruf schlägt zur Laufzeit fehl.


----------



## Der_AltMann (9. Jan 2021)

mrBrown hat gesagt.:


> Wobei, je nachdem was genau du aus jna-platform brauchst, ginge:
> 
> [CODE lang="xml" highlight="9,10"]<module>
> <artifact>
> ...


aus Jna-plattform benötige ich nur

```
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:

```
[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  😄


----------



## Noahscript (9. Jan 2021)

mrBrown hat gesagt.:


> Was denn "je nach dem"?


Es war einfach nur eine Zustimmung zu dem was du vorher geschrieben hast:


mrBrown hat gesagt.:


> je nachdem was genau du aus jna-platform brauchst, ginge:





mrBrown hat gesagt.:


> 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...


----------



## mrBrown (9. Jan 2021)

Der_AltMann hat gesagt.:


> Ich bin mir unsicher, was für ein Modul "null" hier nicht gefunden wird 😄


Ich seh grad, du hast moditect auch als Dependency eingebunden, da muss das raus


----------



## Der_AltMann (9. Jan 2021)

mrBrown hat gesagt.:


> 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 :
	
	
	
	





```
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:

```
<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


----------



## Der_AltMann (11. Jan 2021)

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  👍


----------



## mrBrown (11. Jan 2021)

Der_AltMann hat gesagt.:


> 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.


----------



## Sandro95 (3. Mrz 2022)

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 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>
```


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

JavaFX 8 - How to build EXE with Maven & INNO
					

I have not been able to successfully find a working solution on how to configure Maven to build an EXE from JavaFX with Maven.  Projects set up with E(fx)clipse using the build.fxbuild work great,




					stackoverflow.com
				



javafx maven plugin und jpackage sind deine Freunde oder

launch4j


----------



## Sandro95 (3. Mrz 2022)

Joreyk hat gesagt.:


> JavaFX 8 - How to build EXE with Maven & INNO
> 
> 
> I have not been able to successfully find a working solution on how to configure Maven to build an EXE from JavaFX with Maven.  Projects set up with E(fx)clipse using the build.fxbuild work great,
> ...


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


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

das ist mein ding was ich zum ausspucken für installations dateien benutze


```
<?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


----------



## Sandro95 (3. Mrz 2022)

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


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

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)


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

Sandro95 hat gesagt.:


> 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


----------



## Sandro95 (3. Mrz 2022)

Joreyk hat gesagt.:


> das ist mein ding was ich zum ausspucken für installations dateien benutze
> 
> 
> ```
> ...


und wie startest du dan ndie Anwenng ?


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

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  )


----------



## Sandro95 (3. Mrz 2022)

Joreyk hat gesagt.:


> 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


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

Sandro95 hat gesagt.:


> 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


----------



## Gelöschtes Mitglied 65838 (3. Mrz 2022)

das sdependency kopiert irgendwas rüber was du dann später fürs jpackage brauchst, also das darfst net löschen


----------

