[英]jPackage - Wix - App doesn’t launch, but there are no diagnostic messages
我一直在尝试 package 我的 java javafx 桌面应用程序在 ZAEA234298CE3AA9B448B33D21F46Z javafx 桌面应用程序上使用 jPackage
该应用程序在 Netbeans 下运行良好,但是当我单击安装程序生成的快捷方式或尝试使用命令行界面运行它时,没有任何反应(没有错误消息)。
我正在使用 java 版本 17.0.1 2021-10-19 LTS
问题
我一直无法发现错误是什么。 它在 Netbeans 中运行得非常愉快,所以我认为这与我设置 JPackage arguments 的方式有关,但我看不出错误是什么。 如果没有任何诊断消息,就很难诊断问题。
我做了什么来创建应用程序安装程序
在运行 JPackage 之前,我创建了一个“Package”目录并将 jar 主文件和其他应用程序文件复制到其中的“config”目录中。 然后我将配置目录定义为输入目录。 output 目录到我的当前目录。 (参见下面的 jPackage 命令)。
因此,我的打包目录结构是...
配置文件包含以下内容:
libs 文件夹包含 jars 列表,例如 log4j 等,mods 文件夹下是 javaFX 17 个模块。
PictureTool4-1.0.exe是JPackage生成的安装程序,命令如下:
c:\Dev\Package\PictureTool4\Package>jPackage --name pictureTool4 --input config --main-jar PictureTool4-4-0.jar --module-path mods\javafx-jmods-17.0.1 --add-modules javafx.media,javafx.fxml,javafx.swing,javafx.controls,javafx.graphics --win-dir-chooser --win-shortcut
PictureTool4-4-0.jar中的Manifest文件包含主要的class:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: User
Build-Jdk: 17.0.1
Class-Path: libs/log4j-api-2.13.0.jar etc ... list of jars)
Main-Class: omac.main.JFXPictureToolMain
我还尝试了什么…… *
1 添加了系统退出消息。
紧接着应用程序主...
public static void main(String[] args) {
System.out.println("PictureTool4 has started");
launch(args);
}
并通过将--java-options "-splash:\$APPDIR/PictureTool-Splash.jpg"
添加到 jPackage arguments 来添加启动屏幕。
该应用程序没有显示启动画面或任何消息。
参考
Stackoverflow.com 在 Java 你如何调试 JPackage 创建的 exe
https://docs.oracle.com/en/java/javase/14/jpackage/packaging-tool-user-guide.pdf
您的命令行未提及其他 SO 帖子中引用的--win-console
,因此请确保首先处于活动状态。
然后检查您是否已陷入此陷阱 - 如果您的应用程序版本相同,则第二个安装程序永远不会运行。
完成上述操作并重新构建后,正确卸载最后安装的版本并使用新的jpackage
安装程序重新安装。
如果 EXE 仍然不起作用,请仔细检查您是否具有所需的应用程序依赖项并测试jpackage
为您构建的隐式jlink
实际包含依赖项的 Java 运行时。 这从命令行很简单,只需使用新的 JRE HOME 运行 Java 应用程序:
set "APP_HOME=C:\Program Files\YOUR_APP"
%JAVA_HOME%\runtime\bin\java -cp %APP_HOME%\app\PictureTool4-4-0.jar your.Main
如果上述方法不起作用,则您错过了库。 考虑显式使用 jlink( 如本答案所示),因为如果您的应用程序 jar 模块依赖项没有更改,则无需使用jpackage
制作的隐式jlink
重新生成 JRE。
我现在已经解决了我的打包问题,应用程序现在正在运行。 我决定,我会在这里发布我的解决方案,而不是作为我的问题的更新。
我分三步完成了包装:
第 1 步我的应用程序在根目录中查找属性文件。 然而,由 jPackage 生成的应用安装程序会创建一个运行时和一个应用目录。 根目录只包含一个app exe文件和一个ico文件。 jPackage 将 -input 参数中定义的目录中的所有文件复制到应用程序目录,包括我的属性文件。 因此,我将我的应用程序更改为查看应用程序目录而不是根目录。
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. 这不是一个非常用户友好的列表,但我能够手动创建我需要的 java 模块的列表。
当我运行 jdeps 时,出现错误“未找到模块 java.xml.bind 所需的模块 java.activation。” 如下:
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 导致了这个问题,所以我从列表中删除了 jars。 我不知道为什么 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 的新手,非常感谢您的帮助。
目录结构
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.