[英]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.