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