我现在已经解决了我的打包问题,应用程序现在正在运行。我决定,我会在这里发布我的解决方案,而不是作为我的问题的更新。
我分三步完成了包装:
- 将应用更改为在应用目录中查找其属性文件。
- 确定了我的应用程序 java 模块依赖项。
- 使用模块列表、我的应用程序的 jar 和我的应用程序使用的公共 jars 来构建我的应用程序 Windows 安装程序。
第 1 步
我的应用程序在根目录中查找属性文件。然而,由 jPackage 生成的应用安装程序会创建一个运行时和一个应用目录。根目录只包含一个app exe文件和一个ico文件。 jPackage 将 -input 参数中定义的目录中的所有文件复制到应用程序目录,包括我的属性文件。因此,我将我的应用程序更改为查看应用程序目录而不是根目录。
第 2 步 -
为了确定我的应用程序需要哪些 java 模块,我将 jdeps 与我的应用程序 jar 文件、javaFX jars(不是模块)和我的应用程序使用的公共 jars 一起使用,以生成我的应用程序需要的包列表。
这不是一个非常用户友好的列表,但我能够手动创建我需要的 java 模块列表。
当我运行 jdeps 时,我收到错误“找不到模块 java.activation,java.xml.bind 需要”。如下:
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)
我认为是 jaxb 导致了这个问题,所以我从列表中删除了这些 jar。我不知道为什么 jDeps 抱怨,但我猜是因为 jaxb 2.3.1 与 Java SE 17 不兼容。我会做一些进一步的研究。当我再次运行 jDeps 时,它给了我一个包列表,如下所示:
`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 确定了我需要包含在应用程序运行时中的 21 个模块。
第 3 步 - 包装。
我使用了步骤 2 中确定的 21 个依赖项,并使用 jPackage 构建了安装程序,如下所示:
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
然后我安装了该应用程序,它按预期工作。
我是 Stack Overflow 的新手,非常感谢您的帮助。
目录结构