I have now resolved my packaging issues and the app is now running. I decided, I would post my solution here and not as an update to my question.
I did the packaging in three steps:
- Changed the app to look in the app directory for its properties file.
- Determined my apps java module dependencies.
- Used the list of modules, my app's jar, and public jars my app uses, to build my apps windows installer.
Step 1
My app looked in the root directory for a properties file. However the app installer produced by jPackage creates a runTime and an app directory. The root directory only contains an app exe file and an ico file. jPackage copies all the files in the directory defined in the -input argument to the app directory including my properties file. I therefore changed my app to look in the apps directory rather than the root.
Step 2 -
To determine what java modules my app needed I used jdeps with my apps jar file, javaFX jars (not modules) and the public jars my app uses, to produce a list of packages my app needs.
This was not a very user friendly list, but I was able to manually create the list of java modules I needed.
When I ran jdeps I got the error "Module java.activation not found, required by java.xml.bind". As follows:
C:\Dev\Package\PictureTool4\Package>jdeps -summary --multi-release 17 config/PictureTool4-4.0.jar config/libs/apiguardian-api-1.1.0.jar config/libs/commons-csv-1.4.jar config/libs/javassist-3.28.0-GA.jar config/libs/javax.activation-api-1.2.0.jar config/libs/log4j-api-2.13.0.jar config/libs/log4j-core-2.13.0.jar config/libs/jaxb-api-2.3.1.jar config/libs/jaxb-core-2.3.0.1.jar config/libs/jaxb-impl-2.3.1.jar jfxlib/javafx.controls.jar jfxlib/javafx.controls.jar jfxlib/javafx.fxml.jar jfxlib/javafx.swing.jar jfxlib/javafx.base.jar jfxlib/javafx.graphics.jar
Exception in thread "main" java.lang.module.FindException: Module java.activation not found, required by java.xml.bind
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)
I assumed that jaxb was causing the issue so I removed the jars from the list. I don't know why jDeps complained, but I am guessing its because jaxb 2.3.1 is not compatible with Java SE 17. I will do some further research. When I ran jDeps again it gave me a list of packages as follows:
`C:\Dev\Package\PictureTool4\Package>jdeps -summary --multi-release 17 config/PictureTool4-4.0.jar config/libs/apiguardian-api-1.1.0.jar config/libs/commons-csv-1.4.jar config/libs/javassist-3.28.0-GA.jar config/libs/javax.activation-api-1.2.0.jar config/libs/log4j-api-2.13.0.jar config/libs/log4j-core-2.13.0.jar jfxlib/javafx.controls.jar jfxlib/javafx.fxml.jar jfxlib/javafx.swing.jar jfxlib/javafx.base.jar jfxlib/javafx.graphics.jar
PictureTool4-4.0.jar -> config\libs\commons-csv-1.4.jar
PictureTool4-4.0.jar -> java.base
PictureTool4-4.0.jar -> java.datatransfer
PictureTool4-4.0.jar -> java.desktop
PictureTool4-4.0.jar -> java.logging
PictureTool4-4.0.jar -> java.prefs
PictureTool4-4.0.jar -> java.xml
PictureTool4-4.0.jar -> javafx.base
PictureTool4-4.0.jar -> javafx.controls
PictureTool4-4.0.jar -> javafx.fxml
PictureTool4-4.0.jar -> javafx.graphics
PictureTool4-4.0.jar -> javafx.swing
PictureTool4-4.0.jar -> not found
PictureTool4-4.0.jar -> org.apache.logging.log4j
commons-csv-1.4.jar -> java.base
commons-csv-1.4.jar -> java.sql
javafx.base -> java.base
javafx.base -> java.desktop
javafx.base -> jdk.jfr
javafx.controls -> java.base
javafx.controls -> javafx.base
javafx.controls -> javafx.graphics
javafx.fxml -> java.base
javafx.fxml -> java.scripting
javafx.fxml -> java.xml
javafx.fxml -> javafx.base
javafx.fxml -> javafx.graphics
javafx.graphics -> java.base
javafx.graphics -> java.desktop
javafx.graphics -> java.xml
javafx.graphics -> javafx.base
javafx.graphics -> jdk.unsupported
javafx.swing -> java.base
javafx.swing -> java.datatransfer
javafx.swing -> java.desktop
javafx.swing -> javafx.base
javafx.swing -> javafx.graphics
javafx.swing -> jdk.unsupported.desktop
javassist-3.28.0-GA.jar -> java.base
javassist-3.28.0-GA.jar -> java.desktop
javassist-3.28.0-GA.jar -> java.instrument
javassist-3.28.0-GA.jar -> java.management
javassist-3.28.0-GA.jar -> jdk.attach
javassist-3.28.0-GA.jar -> jdk.jdi
javax.activation-api-1.2.0.jar -> java.base
javax.activation-api-1.2.0.jar -> java.datatransfer
javax.activation-api-1.2.0.jar -> not found
log4j-core-2.13.0.jar -> config\libs\commons-csv-1.4.jar
log4j-core-2.13.0.jar -> java.base
log4j-core-2.13.0.jar -> java.compiler
log4j-core-2.13.0.jar -> java.desktop
log4j-core-2.13.0.jar -> java.logging
log4j-core-2.13.0.jar -> java.management
log4j-core-2.13.0.jar -> java.naming
...etc
`
Jdeps identified 21 modules I needed to include in the apps Runtime.
Step 3 - Packaging.
I used the 21 dependencies identified in step 2 and built the installer using jPackage as follows:
jPackage --name PictureTool4 --input config --main-jar PictureTool4-4.0.jar --win-dir-chooser --win-shortcut --module-path mods\javafx-jmods-17.0.1 --add-modules javafx.media,javafx.fxml,javafx.swing,javafx.controls,javafx.graphics,java.datatransfer,java.desktop,java.logging,java.prefs,java.xml,java.sql,java.scripting,jdk.unsupported.desktop,java.instrument,java.management,jdk.attach,jdk.jdi,java.compiler,java.naming,java.rmi
I then installed the app and it worked as expected.
I am new to Stack Overflow, so thankyou for your help.
Directory Structure
