JPanel
当我尝试使用NODE_OPTIONS="--max-old-space-size=128"
创建本机映像时,我得到了:
错误:在图像堆中检测到启动的线程。正在运行的线程 图像生成器不再在图像运行时运行。的 对象可能是由类初始化程序创建的,并且可以访问 从静态字段。默认情况下,所有类初始化都已完成 在本机图像构建期间。您可以手动延迟课程 使用选项初始化到图像运行时 -H:ClassInitialization =。或者,您可以编写自己的初始化方法,然后从主条目中显式调用它们 点。
详细消息:跟踪:对象sun.java2d.opengl.OGLRenderQueue 字段sun.java2d.opengl.OGLRenderQueue.theInstance
答案 0 :(得分:1)
这都与何时初始化一个类有关– GraalVM团队对此主题进行了更新: https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7
短版:使用跟踪(比您的Graal包更新的版本中添加了)来查找所谓的有问题的类,然后将其设置为在运行时初始化。容易说,很难做。 就其价值而言,我在19.2(企业版)版本和一些包含AWT的随机代码中遇到了相同的问题。消息已更改(为清晰起见,对其进行了略作编辑):
错误:在图像堆中检测到启动的线程。线程正在运行 图像生成器中的不再在图像运行时运行。至 了解如何使用
-H:+TraceClassInitialization
实例化该对象。 该对象可能是由类初始化程序创建的,并且是 从静态字段可到达。您可以请求类初始化 通过使用选项在图像运行时--initialize-at-build-time=<class-name>
。或者,您可以编写自己的初始化方法,然后从主条目中显式调用它们 点。Trace: object sun.awt.AWTAutoShutdown method sun.awt.AWTAutoShutdown.getInstance()
我将通过(可能从与AWT等效的“ Hello World”开始,如果成功的话)来更新我的答案,并提供具体细节。Google到处都是无法使用Swing / AWT / JavaFX的本地图像的示例,所以我不确定我是否会成功。
免责声明:我为Oracle工作,但不在与Graal开发人员紧密联系的组织(可能没有共同的经理)工作。我说的是我的意见。