# jpackage zusätzlich zu deb installer auch einen windows installer bauen



## Mart (7. Nov 2021)

Ich habe es geschafft mit dem in der pom einen .deb installer für mein Linux zu bekommen was auch funktioniert 

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

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

                    
                    <!--  <winConsole>true</winConsole>
                    <winDirChooser>true</winDirChooser>
                    <winMenu>true</winMenu>
                    <winMenuGroup>true</winMenuGroup>
                    <winShortcut>true</winShortcut>  -->
                    
                    <linuxShortcut>true</linuxShortcut>
                    <linuxPackageName>nex</linuxPackageName>
                    <linuxAppCategory>Utilities</linuxAppCategory>
                    <linuxMenuGroup>Utilities</linuxMenuGroup>
                    
                    <!-- <icon>${project.basedir}/draco.png</icon> -->
                    <javaOptions>
                        <option>-Dfile.encoding=${project.build.sourceEncoding}</option>
                    </javaOptions>
                    
                </configuration>

                
            </plugin>
```
anscheinend ( ? ) kann man da auch mit den win und mac attributen einen jeweiligen installer erstellen, nur ich hab weder windows noch mac parat wo ich das projekt durchlaufen lassen kann, wie kann man nun mit dem jpackage für die anderen 2 OS sich auch noch installer ausgeben lassen

hatte zwar schon den <launchers> tag drinnen aber damit konte ich nur einen weiteren launcher erstellen der wieder .deb war aber da hab ich einfach nichts gefunden was für mich verständlich war 
ich habe es jetzt schon mal geschafft zu verstehen was ich alles nicht brauche und konnte die pom verkürzen aber jetzt komm ich mit den mehreren launchern nicht weiter und weis gar nicht nach was ich überhaupt suchen sollte oder was ich machen sollte
hier ist nochmal die ganze pom

```
<?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-SNAPSHOT</version>


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

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

                    
                    <!--  <winConsole>true</winConsole>
                    <winDirChooser>true</winDirChooser>
                    <winMenu>true</winMenu>
                    <winMenuGroup>true</winMenuGroup>
                    <winShortcut>true</winShortcut>  -->
                    
                    <linuxShortcut>true</linuxShortcut>
                    <linuxPackageName>nex</linuxPackageName>
                    <linuxAppCategory>Utilities</linuxAppCategory>
                    <linuxMenuGroup>Utilities</linuxMenuGroup>
                    
                    <!-- <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.openjfx/javafx-fxml -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
    </dependencies>
</project>
```


----------



## kneitzel (7. Nov 2021)

So einfach ist das nicht, da ja jeweils
A) das entsprechende JRE / Module
B) auf die Tools der Plattforn 
zugegriffen wird.

Unter https://stackoverflow.com/questions...for-a-java-application-for-multiple-targets-o findet man noch ein paar Ideen, wie man evtl. doch noch das eine oder andere hin bekommen kann.

Jlink kann wohl auch Cross Platform wenn man lokal auf ein JDK der jeweiligen Plattform verweist.

Mein Weg sind aber generell entsprechende Build Systeme der Plattform. Dies kann auch teilweise einfach in Docker sein, aber damit habe ich auch noch nichts gemacht (in der Vergangenheit aber auch schon Beschreubungen gefunden um mac os in einem Docker Inage zu nutzen.


----------



## Mart (7. Nov 2021)

das optimale wäre ja wenn mein java 16 und die javavm eifnahc mitgeliefert werden würde sodass der User kein Java mehr installieren braucht

ich werde mal das von stack overflow durchmachen vllt kommt das richtige raus


----------



## kneitzel (7. Nov 2021)

Hatte jetzt nicht im Detail geschaut: Du rufst nur Jpackage auf um einen Installer zu bauen?

Der Weg, der ich immer einschlage, ist:
- Ich baue erst mit JLink ein entsprechendes Image, welches alles beinhaltet (Also die Module des JRE, alle Abhängigkeiten und meine Klassen/Ressourcen) und das dann auch Start-Scripte mitliefert.
- Das Image von JLink baue ich dann mittels JPackage zu einem App-Image, d.h. bei Mac kommt eine Applikation heraus, die man einfach in Programme ziehen kann, beim Linux hat man eine Verzeichnisstruktur mit einem Binary im bin Ordner, das einfach gestartet werden kann und bei Windows halt eine Ordnerstruktur mit einer EXE im bin Ordner.

Damit hast Du dann schon gleich alles mit drin und man braucht kein Java mehr lokal zu installieren.


----------



## Mart (7. Nov 2021)

kneitzel hat gesagt.:


> Hatte jetzt nicht im Detail geschaut: Du rufst nur Jpackage auf um einen Installer zu bauen?


ja und soweit ich das lesen konnte, nimmt das dann meine platform her zb jetzt debian und baut einen installer dazu wenn ich auf windows wäre würde es eine exe struktur erzeugen ... nur es ist umständlich das immer auf den 3 betriebssystemen druchlaufen zu lassen

jpackage baut halt nur 1e appimage pro durchlauf nur ich hab noch nicht überrissen wie man das umstellen kann somit es gleich alles macht


EDIT: 

was mir aufgefallen ist dass                     <runtimeImage>target/${main.module}</runtimeImage>
eig das runtime Image das von jlink sucht und hernimmt... ich hab kein jlink in der pom... woher kommt das dann her


----------



## Mart (7. Nov 2021)

Brief Example Using the Early Access jpackage Utility - DZone
					

Check out this post to learn more and view examples of the newest, early access jpackage utility build from OpenJDK 13, with useful sample code.




					dzone.com
				






> When complete, the single appimage/directory contains the platform-specific application directory. In the video, the MacOS-generated appimage/ directory has a SocketClientFX.app icon, which is, in reality, a directory with multiple subdirectories. To the MacOS finder application though, it looks like a properly formatted application, and by simply dragging the SocketClientFX.app icon to the Applications folder, the SocketClientFX application is formally installed.


das sagt das aus was ich meinte... dass es auf die platform wo ich bin drauf ankommt was raus kommt


----------



## kneitzel (7. Nov 2021)

Ja, alleine schon, da das Tool ja auch die entsprechenden Abhängigkeiten hat.

JLink hat weniger Abhängigkeiten und kann prinzipiell auch Images bauen von anderen Plattformen. Dazu muss man lediglich die jmods der jeweiligen Plattform bereit stellen (Und bei Abhängigkeiten, die auch Plattform Abhängig sind, muss man die natürlich auch richtig einbinden - also z.B. bei JavaFX).

Und wenn Du denn Link von meiner ersten Antwort anschaust:


> When you update your code and recompile, you can just copy the new jars into the pre-built app image.


Da ist also die Idee, vorhandene Ergebnisse von JPackage manuell anzupassen.

Generell ist das aber alles kein Weg, den ich gehen würde, denn da sind zu viele Stolperfallen. Ich würde immer auf die original Systeme setzen (also Windows, Mac und Linux) - und hierzu ggf. VMs aufsetzen. Das kann ggf. sogar über Docker laufen. Mac os Images sind aber so nicht vorgesehen. Ich hatte mal einen Link gesehen, wo jemand sich aber sowas gebaut hat - das finde ich aber nicht mehr.

BTW: Ich sehe gerade: QEMU um einen mac os laufen zu lassen und das kann man wohl in Docker laufen lassen


----------



## Mart (7. Nov 2021)

kneitzel hat gesagt.:


> Generell ist das aber alles kein Weg, den ich gehen würde, denn da sind zu viele Stolperfallen. Ich würde immer auf die original Systeme setzen (also Windows, Mac und Linux) - und hierzu ggf. VMs aufsetzen. Das kann ggf. sogar über Docker laufen. Mac os Images sind aber so nicht vorgesehen. Ich hatte mal einen Link gesehen, wo jemand sich aber sowas gebaut hat - das finde ich aber nicht mehr.


gut dann werd ich diesen weg einschlagen... vms aufsetzen kann ich ja  
die parameter für windows und mac kann ich ja drin lassen die werden sowieso ignoriert wenn es nicht die aktuelle plattform ist


----------



## mrBrown (7. Nov 2021)

Je nachdem was du machst bieten sich auch z.B. Github Actions an, da kann man Windows, macOS und Linux als Build-System nutzen


----------



## Mart (7. Nov 2021)

mrBrown hat gesagt.:


> Je nachdem was du machst


das ziel ist es den debian installer der einwandfrei funktioniert auch für windows zu bekommen , ich werde mir das github actions anschauen wenn ich weis dass es auch auf windows funktioniert

nicht dass ich wieder mal was falsch auf maven eingestellt hab und dann wieder planlos im weltall umher irre


----------

