简体   繁体   English

无法从可执行的 javafx fat jar 生成带有 --no-fallback 的 Graal VM native-image

[英]Can't generate Graal VM native-image with --no-fallback from executable javafx fat jar

I have build an executable javaFX fat jar using java 17 and javafx 18:我已经使用 java 17 和 javafx 18 构建了一个可执行的 javaFX fat jar: 在此处输入图像描述

The JavaFXLauncher class calls the Main class which is necessary so that the executable JavaFX jar will work. JavaFXLauncher 类调用 Main 类,这是必需的,这样可执行的 JavaFX jar 才能工作。 It looks like this:它看起来像这样:

    public class Main extends Application {

    @Override
    public void start(Stage stage) {
        VBox vBox = new VBox();
        Button okButton = new Button("OK");
        okButton.setOnAction(e -> new Alert(Alert.AlertType.INFORMATION).showAndWait());

        TextField searchTextField = new TextField();
        vBox.getChildren().addAll(searchTextField);

        ContextMenu contextMenu = new ContextMenu();

        Trie<String, Integer> trie = new PatriciaTrie<>();
        trie.put("calorimetru", 0);
        trie.put("calamar", 0);
        trie.put("abecedar", 0);
        trie.put("calorie", 0);

        searchTextField.setOnKeyTyped(e -> {
            TextField self = (TextField) e.getSource();

            if (StringUtils.isEmpty(self.getText())) {
                contextMenu.hide();
                return;
            }

            Set<String> items = trie.prefixMap(self.getText()).keySet();
            if (!items.isEmpty()) {
                Bounds boundsInScreen = self.localToScreen(self.getBoundsInLocal());
                int height = (int) self.getHeight();
                contextMenu.getItems().clear();
                items.forEach(item -> contextMenu.getItems().add(new MenuItem(item)));
                contextMenu.show(self, boundsInScreen.getMinX(), boundsInScreen.getMinY() + height);
            }

        });

        Scene scene = new Scene(vBox, 500, 500, Color.WHEAT);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

I have built a native image using native-image like this:我已经使用 native-image 构建了一个原生镜像,如下所示:

    c:\Users\adragomir\IdeaProjects\learnLambda\target>native-image.cmd -jar learnLambda-1.0.jar learn.lambda.JavaFXLauncher --no-fallback
========================================================================================================================
GraalVM Native Image: Generating 'learn.lambda.JavaFXLauncher' (executable)...
========================================================================================================================
[1/7] Initializing...                                                                                   (26,7s @ 0,14GB)
 Version info: 'GraalVM 22.1.0 Java 17 CE'
 C compiler: cl.exe (microsoft, x64, 19.32.31332)
 Garbage collector: Serial GC
[2/7] Performing analysis...  [******]                                                                  (24,5s @ 0,58GB)
   4.048 (75,16%) of  5.386 classes reachable
   5.312 (52,92%) of 10.037 fields reachable
  17.728 (44,22%) of 40.090 methods reachable
      43 classes,     0 fields, and   526 methods registered for reflection
      62 classes,    54 fields, and    51 methods registered for JNI access
[3/7] Building universe...                                                                               (2,1s @ 0,85GB)
[4/7] Parsing methods...      [*]                                                                        (1,7s @ 1,15GB)
[5/7] Inlining methods...     [****]                                                                     (2,1s @ 1,20GB)
[6/7] Compiling methods...    [****]                                                                    (18,9s @ 2,68GB)
[7/7] Creating image...                                                                                  (3,7s @ 0,60GB)
   6,43MB (40,03%) for code area:   10.265 compilation units
   8,43MB (52,52%) for image heap:   2.558 classes and 120.816 objects
   1,20MB ( 7,45%) for other data
  16,06MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area:                               Top 10 object types in image heap:
 743,04KB java.util                                            1,29MB byte[] for code metadata
 376,80KB java.lang                                            1,14MB byte[] for general heap data
 359,01KB javafx.css                                           1,12MB java.lang.String
 346,56KB com.oracle.svm.jni                                 929,29KB java.lang.Class
 276,85KB java.text                                          725,44KB byte[] for java.lang.String
 238,47KB com.oracle.svm.core.reflect                        403,36KB java.util.HashMap$Node
 238,30KB java.util.regex                                    316,25KB com.oracle.svm.core.hub.DynamicHubCompanion
 205,60KB java.util.concurrent                               247,83KB java.util.concurrent.ConcurrentHashMap$Node
 149,52KB java.math                                          221,23KB java.lang.String[]
 148,15KB com.oracle.svm.core.code                           188,09KB java.util.HashMap$Node[]
      ... 179 additional packages                                 ... 1052 additional object types
                                           (use GraalVM Dashboard to see all)
------------------------------------------------------------------------------------------------------------------------
                        2,6s (3,2% of total time) in 22 GCs | Peak RSS: 3,73GB | CPU load: 4,36
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
 c:\Users\adragomir\IdeaProjects\learnLambda\target\learn.lambda.JavaFXLauncher.exe (executable)
 c:\Users\adragomir\IdeaProjects\learnLambda\target\awt.dll (jdk_lib)
 c:\Users\adragomir\IdeaProjects\learnLambda\target\java.dll (jdk_lib_shim)
 c:\Users\adragomir\IdeaProjects\learnLambda\target\jvm.dll (jdk_lib_shim)
 c:\Users\adragomir\IdeaProjects\learnLambda\target\learn.lambda.JavaFXLauncher.build_artifacts.txt
========================================================================================================================
Finished generating 'learn.lambda.JavaFXLauncher' in 1m 22s.

Everything seems fine but when I try to run the exe I get:一切似乎都很好,但是当我尝试运行 exe 时,我得到:

    $ ./learn.lambda.JavaFXLauncher.exe
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: learn.lambda.Main
        at javafx.application.Application.launch(Application.java:314)
        at learn.lambda.Main.main(Main.java:67)
        at learn.lambda.JavaFXLauncher.main(JavaFXLauncher.java:5)
Caused by: java.lang.ClassNotFoundException: learn.lambda.Main
        at java.lang.Class.forName(DynamicHub.java:1121)
        at javafx.application.Application.launch(Application.java:302)
        ... 2 more

I am using --no-fallback because I don't want to be dependent on a jvm, so I just want to run the exe by itself.我使用 --no-fallback 是因为我不想依赖 jvm,所以我只想自己运行 exe。

Do you guys have some idea on what could be wrong?你们有什么想法可能是错的吗?

Regards,问候,

It seems the problem is missing reflection configuration.似乎问题在于缺少反射配置。 GraalVM static analyzer cannot figure out which features are accessed reflectively, so it relies on configuration files. GraalVM 静态分析器无法确定反射访问哪些功能,因此它依赖于配置文件。 You can create one manually as described here , or generate with GraalVM tracing agent as described here .您可以按照此处所述手动创建一个,或者按照此处所述使用 GraalVM 跟踪代理生成。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 GraalVM native-image 如何从 Jar 读取资源文件 - GraalVM native-image how to read resource file from Jar 使用 Graal 的原生图像将 Spigot 工件编译为原生图像:NullPointerException - Compile Spigot artifact to native image using Graal's native-image: NullPointerException 无法在 ubuntu 20.04.3 LTS 上安装 Graalvm 本机映像 - Can't install Graalvm native-image on ubuntu 20.04.3 LTS Swing应用程序的Graal本机映像:在映像堆中检测到启动的线程 - Graal native-image of swing app: Detected a started Thread in the image heap Graal native-image 命令返回错误“请指定包含主入口点方法的 class” - Graal native-image command returns error "Please specify class containing the main entry point method" 通过运行Exec任务构建jar之后,从gradle中使用graalvm构建本机映像 - Build native-image using graalvm from within gradle after jar is built by running Exec task 多模块 Maven 和 Spring Boot 项目不会为辅助模块生成胖可执行 jar - Multi-module Maven and Spring Boot project doesn´t generate fat executable jar for secondary module 如何使用Maven项目在JavaFX中生成可执行jar - How to generate executable jar in JavaFX with maven project 从GraalVM本机图像中的Java代码运行JS脚本 - Running JS script from Java code in GraalVM native-image GraalVM (native-image) 无法编译 logback 依赖 - GraalVM (native-image) can not compile logback dependencies
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM