我一直在尝试在Windows上使用jPackage打包java javafx桌面应用程序。
该应用程序在Netbeans下运行良好,但当我单击安装程序生成的快捷方式或尝试使用命令行界面运行它时,什么也没有发生(没有错误消息)。
我使用的是java版本17.0.1 2021-10-19 LTS
问题
我一直无法发现错误是什么。它在Netbean中运行得很好,所以我认为这与我设置JPackage参数的方式有关,但我看不到错误是什么。没有任何诊断消息,很难诊断问题。
我如何创建应用程序安装程序
在运行JPackage之前,我创建了一个“Package”目录并将主jar文件和其他应用程序文件复制到其中的“config”目录中。然后我将配置目录定义为输入目录。我当前目录的输出目录。(请参阅下面的jPackage命令)。
因此,我的打包目录结构是。。。
配置文件包含以下内容:
libs文件夹包含log4j等jars列表,mods文件夹下是javaFX 17模块。
图片工具4-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
Picture Tool4-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);
}
并通过在jPackage参数中添加“\$APPDIR/PictureTool splash.jpg”来添加启动屏幕。
该应用程序没有显示启动屏幕或任何消息。
参考文献
堆栈溢出。Java中的com如何调试JPackage创建的exe
https://docs.oracle.com/en/java/javase/14/jpackage/packaging-tool-user-guide.pdf
我现在已经解决了打包问题,应用程序现在正在运行。我决定,我会在这里发布我的解决方案,而不是作为我问题的更新。
我分三步进行包装:
步骤1我的应用程序在根目录中查找属性文件。然而,jPackage生成的应用程序安装程序创建了一个运行时和一个应用程序目录。根目录仅包含app exe文件和ico文件。jPackage将-input参数中定义的目录中的所有文件复制到应用程序目录,包括我的属性文件。因此,我将我的应用程序更改为查看应用程序目录,而不是根目录。
步骤2-为了确定我的应用程序需要哪些java模块,我将JDEP与我的应用程序jar文件、javaFX jar(非模块)和我的应用程序使用的公共jar一起使用,以生成我的应用程序需要的包列表。这不是一个非常用户友好的列表,但我能够手动创建所需的java模块列表。
当我运行jdeps时,我得到了错误“Module java.activation not found,required by 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导致了这个问题,所以我从列表中删除了jars。我不知道jDeps为什么抱怨,但我猜是因为jaxb 2.3.1与JavaSE 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的新手,所以感谢您的帮助。
目录结构
您的命令行没有提到另一个SO帖子中引用的win console,因此请确保它首先处于活动状态。
然后检查您是否落入此陷阱-如果您有相同的应用程序版本,则第二个安装程序永远不会运行。
完成上述操作并重新构建后,请正确卸载上次安装的版本,然后使用新的安装程序包重新安装。
如果EXE仍然不起作用,请仔细检查您是否有所需的应用程序依赖项,并测试由jpack
为您构建的隐式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程序转换为。exe文件?
我尝试使用pyinstaller模块将我的python gui应用程序(.py)转换为可执行文件(.exe)。我在终端中运行了以下命令- pyinstaller.exe--onefile-w sourcecode.py
我在https://grails.org/wiki/Quick当我用“grails run app”启动应用程序时,它运行良好。 如果我使用“grails war”构建应用程序并将war部署到我的tomcat 8中,我只会收到404个错误。tomcat管理器应用程序将我的应用程序列为已启动,日志文件中没有错误。 我错过了什么? 我使用grails 3.2.0 这似乎是引导。未执行groovy。我这
我正在尝试开发一个应用程序,它应该能够运行在只有CLI的环境中,以及在启用GUI的模式下。由于我的一些工作是由Jav FX线程完成的,所以我需要在不启动图形引擎的情况下启动JavaFX主线程,因为这在只使用CLI的环境中会崩溃。我该怎么做?我已经编写了第一个主类,它将使用命令行参数来决定GUI是否将被启动或者它应该在CLI模式下运行。GUI已经工作了,我只需要弄清楚如何在另一个类中运行没有GUI的
我有一个Spring Boot应用程序,其中有一个Kafka消费者和生产者。还有一个bean来创建主题。 我的Spring Boot应用程序和Kafka都是在Kubernetes的Docker启动的。有时Spring Boot应用程序在Kafka pod启动之前就启动了,因此无法启动,因为用户无法连接(参见stacktrace)。 有没有一种方法可以让我的应用程序以弹性的方式启动?例如,消费者应该
试图在我的应用程序中实现GCM。编译成功。但当我运行我的应用程序时,它崩溃了。堆栈跟踪: 而且 java.lang.IncompatibleClassChangeError:方法“java.io.file android.support.v4.content.contextCompat.GetNoBackupFilesDir(android.content.context)”应为virtual类型
我在Windows下使用PostgreSQL9.5安装SN5.5。不幸的是,我打错误"Webapp没有启动"。 下面是完整的堆栈跟踪。我想我首先在“Exception sending context initialized event to listener instance of class org.sonar.server.platform.PlatformServletContextList