繁体   English   中英

jPackage - Wix - 应用程序无法启动,但没有诊断消息

[英]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 的方式有关,但我看不出错误是什么。 如果没有任何诊断消息,就很难诊断问题。

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

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

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

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

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

并通过将--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。

如何将我的 Java 程序转换为 an.exe 文件?

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

我分三步完成了包装:

  1. 将应用程序更改为在应用程序目录中查找其属性文件。
  2. 确定了我的应用程序 java 模块依赖项。
  3. 使用模块列表、我的应用程序的 jar 和我的应用程序使用的公共 jars 来构建我的应用程序 windows 安装程序。

第 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM