当前位置: 首页 > 知识库问答 >
问题:

使用Quarkus或Springboot和JavaFx的本机可执行文件

申屠晟
2023-03-14

我正在尝试为一个使用Quarkus和JavaFx的应用程序构建一个本机可执行文件。我实现这一点的唯一方法是将许多javaFx类标记为——在运行时初始化,但这导致在尝试启动应用程序时失败,并显示以下消息:

java.lang.ClassNotFoundException: com.sun.javafx.tk.quantum.QuantumToolkit
at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:71)
at java.lang.Class.forName(DynamicHub.java:1319)
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:251)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.lang.Thread.run(Thread.java:829)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:567)
at com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:138)
2021-09-09 16:02:21,173 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.lang.RuntimeException: No toolkit found
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:273)                                              
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)                                               
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)                                               
at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)                                          
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)                                    
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)                            
at java.lang.Thread.run(Thread.java:829)                                                                                
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:567)                                      
at 
com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:138)   

我想我需要在构建之前添加javafx模块,但不知道如何从Maven实现这一点。如果有人能帮助我,我将非常感激。提前谢谢。

PS:如果有人知道使用springboot的替代解决方案,请分享:)

更新:使用SpringBoot进行了测试,并且在Spring原生和gluonfx中也失败了。

制作了一个最小的可再现性,您可以从以下网站下载:https://github.com/ikaro143/JavaFx-SpringBoot-example/tree/master

maven命令应在VisualStudio本机工具命令Promp中执行

要使用spring插件构建,请使用:mvn clean package-Pnative

要使用gluonfx构建,请使用:mvn清洁gluonfx:build-Pnate-gluonfx

在这两种情况下. exe都已构建,但两者都不起作用。

控制台执行spring编译会抛出这个stackTrace(gluon构建的执行不会给出任何反馈,但两者都不起作用):

Exception in thread "main" java.lang.RuntimeException: Application launch error
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:202)
        at java.lang.Thread.run(Thread.java:829)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:567)
        at com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:138)
Caused by: java.lang.AssertionError: java.lang.ClassNotFoundException: javafx.scene.image.Image
        at com.sun.javafx.util.Utils.forceInit(Utils.java:868)
        at com.sun.javafx.tk.Toolkit.<clinit>(Toolkit.java:945)
        at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:375)
        at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:295)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:286)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:160)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        ... 3 more
Caused by: java.lang.ClassNotFoundException: javafx.scene.image.Image
        at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:71)
        at java.lang.Class.forName(DynamicHub.java:1319)
        at com.sun.javafx.util.Utils.forceInit(Utils.java:865)
        ... 11 more

更新:为Quarkus Jafavx共享最小可再现性

https://github.com/ikaro143/JavaFx-Quarkus-example

要使用quarkus插件构建,请使用:mvn clean package-Pnative

要使用gluonfx构建,请使用:mvn清洁gluonfx:build-Pnate-gluonfx

Quarkus方法在分析步骤失败。有以下几个错误:

analysis:  45,621.43 ms,  3.89 GB                                             
Error: Unsupported features in 12 methods                                                                               
Detailed message:                                                                                                       
Error: Class initialization of com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader failed. Use the option --initialize-at-run-time=com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader to explicitly request delayed initialization of this class.                                                                                                    
Original exception that caused the problem: java.lang.ExceptionInInitializerError                                               
at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)                                            
at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1042)                                          
at jdk.unsupported/sun.misc.Unsafe.ensureClassInitialized(Unsafe.java:698)                                              
at jdk.internal.vm.compiler/org.graalvm.compiler.serviceprovider.GraalUnsafeAccess.ensureClassInitialized(GraalUnsafeAccess.java:77)

gluonfx way在设置步骤失败,出现以下模糊错误:

[com.quarkusjavafx.example.applauncher.cdiapplication:9740]    classlist:   3,592.40 ms,  1.19 GB
[com.quarkusjavafx.example.applauncher.cdiapplication:9740]        (cap):   3,086.44 ms,  1.19 GB
[com.quarkusjavafx.example.applauncher.cdiapplication:9740]        setup:   6,095.10 ms,  1.19 GB
Fatal error:java.lang.NullPointerException
at java.base/java.io.Reader.<init>(Reader.java:167)
at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:72)
at io.quarkus.runtime.graal.ResourcesFeature.beforeAnalysis(ResourcesFeature.java:21)
at com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$11(NativeImageGenerator.java:691)
at com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:71)
at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:691)
at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:532)
at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:491)
at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:380)
at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:543)
at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:119)
at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:573)
[com.quarkusjavafx.example.applauncher.cdiapplication:9740]      [total]:   9,723.35 ms,  1.19 GB

共有1个答案

李经国
2023-03-14

根据JoséPereda的建议进行了更新,我尝试将后端迁移到Micronaut,并成功构建了本机映像。从springboot迁移到micronaut非常容易。只是更改pom中的父项和基本依赖项。

本机图像是使用maven代码生成的:mvn清洁gluonfx: build-Pnate-gluonfx

也许您需要首先使用目标gluonfx: runagent来生成运行所需的配置文件。

根据我的经验,我有一些依赖问题,只有在构建完成后运行目标gluonfx: nativerun时才会注意到。然后调整代码。

我在这里留下一个简单的例子,以防有人需要它:https://github.com/ikaro143/example-micronaut

附言:确保你的主课已注册以进行反思。

 类似资料:
  • 我尝试使用docker构建一个Quarkus本机可执行文件,使用以下命令““ Quarkus版本:2.2.1.最终Maven版本:3.8.1Java版本:11

  • 我遵循了构建quarkus本机可执行文件的步骤。 1.引导项目: 2.在minishift中使用docker 3.生成包: 失败,错误跟踪如下: 根据要求,树输出如下所示:

  • 构建失败 我跟着https://quarkus.io/guides/building-native-image-guide#creating-a-container. 这两种方法都会产生朴素的图像可执行文件。

  • 我正在使用JavaFX Gradle插件构建我的JavaFX应用程序。可以用不同的主类构建多个可执行文件吗?如果是,如何?

  • 我已经使用quarkus maven插件创建了一个quarkus应用程序。 我的maven pom如下: 但是,当我尝试使用 ,我会收到以下错误消息,独立于平台。 我承认我没有创建任何类型的主类,因为quarkus似乎不需要它。但是我如何向Java平台声明我打算让quarkus决定主类呢? 编辑为了回应c. twitter,这里有更多的信息 内容是 我很确定你们中的一些人会要求清单。MF含量 我认

  • OpenPatricianDisplay-0.5.0-Snapshot未指定主类 OpenPatricianDisplay-0.5.0-Snapshot无法启动JVM 看看Windows和Linux包的cfg文件就会发现它们是不同的。当用Windows中的替换Linux时,会产生不同的错误。因此,我不认为他们的不同是原因。在Linux上使用插件创建一个单一模块JavaFX演示应用程序。为了弄清楚它