# Simples Runtime Image mit Jlink



## inDex (18. Nov 2021)

Hallo zusammen, 

ich versuche ein Simples JavaFX Programm mit Jlink zu erstellen, sodass dieses ohne ein JRE/JDK auf einem anderen Rechner auskommt.
Auch nach etlichen Youtube Videos und Tutorials (z.B. Getting Startet) und die Schritte 1 zu 1 nachstellen funktioniert es leider nicht ganz. 

Das Programm funktioniert sowohl in der IDE, als auch als mittles Artifacts erstelltes .jar File. 
Das Problem hängt (wie es aus den Meldungen hervor geht) mit den Modulen zusammen und da ich bisher nicht viel mit 
Maven Projekten / Strukturen und Modulen generell zu tun hatte, weis ich leider nicht wo ich hier den Fehler mache. 

*Hier meine Projektstruktur:*




Spoiler: module-info.java



[CODE lang="java" title="module-info.java"]module myapp.myapp {
    requires javafx.controls;
    requires javafx.base;
    requires javafx.fxml;
    requires java.base;

    opens myapp.myapp to javafx.fxml;
    exports myapp.myapp;
}[/CODE]




*Project Structure in Intellij:*
->* Libraray: *JavaFx JDK wurde der Library hinzugefügt
->* Modules: *JavaFX Lib wurde dem Modul in Dependencies hinzugefügt  (Maven Objekte entfernt)
-> *Artifacts: 



Spoiler: Artifacts Bild









Wenn ich nun versuche das Image mit Jlink zu erzeugen, oder mir die requirements anzeigen zu lasse bekomme ich folgende Fehler:*
`C:\Users\Praktikant\Desktop\LPMProgramming\myapp\out\artifacts\myapp_jar>jdeps myapp.jar
Exception in thread "main" java.lang.module.FindException: Module javafx.controls not found, required by myapp.myapp`


Spoiler: Rest



at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)
at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:49)



`C:\Users\Praktikant\Desktop\LPMProgramming\myapp\out\artifacts\myapp_jar> jlink --module-path myapp.jar --add-modules myapp --output finish --compress=2
Error: Module myapp not found`


Spoiler: Rest



java.lang.module.FindException: Module myapp not found
at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:129)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)
at jdk.jlink/jdk.tools.jlink.internal.Jlink$JlinkConfiguration.resolve(Jlink.java:217)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImageProvider(JlinkTask.java:536)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:424)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:276)
at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:55)
at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:33)



`C:\Users\Praktikant\Desktop\LPMProgramming\myapp\out\artifacts\myapp_jar>jlink --module-path myapp.jar;"C:\Program Files\Java\javafx-jmods-17.0.1" --add-modules ALL-MODULE-PATH --output finish --compress=2
Error: Module myapp.myapp contains package javafx.event, module javafx.base exports package javafx.event to myapp.myapp`

Wo genaue fehlt hier was oder wo mache ich einen Fehler ?
Hoffe jemand sieht das Problem direkt und kann mir weiter helfen. 
Vorab vielen Dank!


----------



## kneitzel (18. Nov 2021)

Wieso rufst Du es manuell auf? Zeig mal deine pom? Wenn Du das openjfx Plugin hast, dann sollte alles da sein und du kannst das Ziel javafx:jlink ausführen.


----------



## inDex (19. Nov 2021)

Ah okay, das Aufrufen über das Maven Toolfenster und javafx:link hat funktioniert!!
Wieder mal eine einfach Lösung auf die man erstmal stoßen muss. Wieso habe ich das in keinem 
Tutorial so gesehen :/


----------



## kneitzel (19. Nov 2021)

Das OpenJFX Plugin bringt zwei neue Ziele:
a) javafx:run - damit wird die Software gebaut und im Anschluss wird das Programm ausgeführt.
b) javafx:jlink - damit wird ein Image gebaut, das dann weiter gegeben werden kann.

Dazu musst Du nur das Maven Ziel ausführen. Das kannst Du über die IDE machen oder manuell auf der Kommandozeile. Das spielt dann keine Rolle.


----------



## kneitzel (19. Nov 2021)

Ah ja, Dein Beitrag wurde bearbeitet 

Etwas Dokumentation findet sich z.B. im getting started im Abschnitt Runtime Images.

Aber zu viel würde ich da ggf. nicht rein investieren - das Plugin ist zwar für den Anfang ganz gut, aber es gibt leider Situationen, in denen es an seine Grenzen kommt und dann wird man eh einen anderen Weg gehen müssen.


----------

