【问题标题】:jPackage - Wix - App doesn’t launch, but there are no diagnostic messagesjPackage - Wix - 应用程序未启动,但没有诊断消息
【发布时间】:2022-01-19 16:01:39
【问题描述】:

我一直在尝试在 Windows 上使用 jPackage 打包我的 java javafx 桌面应用程序。

应用程序在 Netbeans 下运行良好,但当我单击安装程序生成的快捷方式或尝试使用命令行界面运行它时,没有任何反应(没有错误消息)。

我使用的是 java 版本 17.0.1 2021-10-19 LTS

问题

我一直无法发现错误是什么。它在 Netbeans 中运行得非常愉快,所以我认为这与我设置 JPackage 参数的方式有关,但我看不出错误是什么。如果没有任何诊断消息,就很难诊断问题。

  1. 应用启动失败时如何查看消息?
  2. 我正在使用 JavaFX 模块。我应该在我的类路径 libs 文件夹中包含 javafx jar 文件吗?我猜我不应该包含这些模块。
  3. 我是否应该尝试通过创建控制台启动器从控制台运行它。我还不知道怎么做,但会调查。我可能会看到诊断错误和系统输出消息。
  4. 应用启动器是否显示任何可能有帮助的诊断消息 诊断问题。

我做了什么来创建应用安装程序

在运行 JPackage 之前,我创建了一个“Package”目录并将主 jar 文件和其他应用程序文件复制到其中的“config”目录中。然后我将配置目录定义为输入目录。输出目录到我的当前目录。 (参见下面的 jPackage 命令)。

因此我的打包目录结构是...

配置文件包含以下内容:

libs 文件夹包含一个 jar 列表,例如 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 文件包含主类:

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);
}
  1. 添加了启动画面

并通过将--java-options "-splash:\$APPDIR/PictureTool-Splash.jpg" 添加到 jPackage 参数来添加启动屏幕。

应用程序没有显示启动画面或任何消息。

参考文献

Stackoverflow.com In Java how do you debug exe created by JPackage

https://docs.oracle.com/en/java/javase/14/jpackage/packaging-tool-user-guide.pdf

【问题讨论】:

  • 很难帮助解决这个问题。在你的构建过程中似乎有一些手动步骤,我想你应该尽量避免。你可以尝试的一些事情是:让它与一个 hello world 应用程序一起工作,而不是你的整个应用程序,使用joackagescriptfxstandalone exeakman jpackage。建议是正交的。
  • 确保您的 log4j 不会受到log4shell 的攻击。升级 log4j-core 或将其删除并切换到 logback。

标签: java javafx wix jpackage


【解决方案1】:

您的命令行未提及其他 SO 帖子中引用的 --win-console,因此请确保首先处于活动状态。

然后检查一下你没有落入这个陷阱——second installer never runs if you have same app version

完成上述操作并重新构建后,正确卸载上次安装的版本并使用新的jpackage 安装程序重新安装。

如果 EXE 仍然无法运行,请仔细检查您是否拥有所需的 application dependencies 并测试由 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 (as in this answer),因为如果您的应用程序 jar 模块依赖项未更改,则无需使用 jpackage 生成的隐式 jlink 重新生成 JRE。

How can I convert my Java program to an .exe file?

【讨论】:

  • 感谢@DuncG 和其他人的及时回复。我将 —win-console 添加到我的 JPackage 参数中,并且能够生成错误消息。我的应用程序没有找到 lib 目录,因为它不在 config 目录中。我使用 --config 目录作为 JPackage 的 --input 目录,当然它不会复制到安装程序的应用程序目录中。我已经解决了这个问题,但现在我在创建 log4j2 日志目录文件和访问我的属性文件时遇到了问题。似乎已安装的目录受到保护,因为我收到拒绝访问消息并且无法创建目录。再次感谢
  • @OwenMcCarthy 就您的访问问题提出一个新问题,这些是不同的问题。至少在 unix 中,但也适用于其他操作系统的一种常见解决方案是在用户目录下创建一个 .appname 文件夹,并将应用特定的东西(如用户特定的应用首选项)放在那里。
【解决方案2】:

我现在已经解决了我的打包问题,应用程序现在正在运行。我决定,我会在这里发布我的解决方案,而不是作为我的问题的更新。

我分三步完成了包装:

  1. 将应用更改为在应用目录中查找其属性文件。
  2. 确定了我的应用程序 java 模块依赖项。
  3. 使用模块列表、我的应用程序的 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 的新手,非常感谢您的帮助。

目录结构

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多