Skip to content

[native-image] Code using JavaFX fails to generate native image. #365

Closed
@rhencke

Description

@rhencke

When attempting to generate a native image using code that uses JavaFX, an error occurs. I can't exactly understand the root cause given the error message, but I can give the steps to reproduce it.

  1. Create a file HelloWorld.java, containing the example in Example 1-1 at https://docs.oracle.com/javafx/2/get_started/hello_world.htm
  2. Using the Graal toolchain (in this case, graalvm-1.0.0-rc1 from Oracle download was used, on MacOS), compile the Java file: javac HelloWorld.java
  3. Run the native image compiler: native-image -cp . helloworld.HelloWorld

The following error is then shown:

Build on Server(pid: 19186, port: 26681)
   classlist:     120.71 ms
       (cap):   1,658.04 ms
       setup:   1,967.81 ms
    analysis:   2,664.79 ms
error: unsupported features in 6 methods
Detailed message:
Error: Error loading a referenced type: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
Trace:
	at parsing com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph(QuantumToolkit.java:298)
Call path from entry point to com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph():
	at com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph(QuantumToolkit.java:298)
	at com.sun.javafx.tk.quantum.QuantumToolkit.runToolkit(QuantumToolkit.java:340)
	at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$startup$402(QuantumToolkit.java:257)
	at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$611/1642062728.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Original exception that caused the problem: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at jdk.vm.ci.hotspot.HotSpotConstantPool.loadReferencedType(HotSpotConstantPool.java:695)
	at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.loadReferencedType(WrappedConstantPool.java:58)
	at org.graalvm.compiler.java.BytecodeParser.maybeEagerlyResolve(BytecodeParser.java:3847)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.maybeEagerlyResolve(SharedGraphBuilderPhase.java:102)
	at org.graalvm.compiler.java.BytecodeParser.lookupMethod(BytecodeParser.java:3801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1380)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.genInvokeStatic(SharedGraphBuilderPhase.java:171)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:4677)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3065)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:2886)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:880)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:774)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:93)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:47)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:195)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:40)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:36)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:195)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:319)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:308)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:298)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:105)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:344)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:498)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:172)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error: Error loading a referenced type: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
Trace:
	at parsing javafx.stage.Window.<init>(Window.java:1209)
Call path from entry point to javafx.stage.Window.<init>():
	at javafx.stage.Window.<init>(Window.java:155)
	at javafx.stage.Stage.<init>(Stage.java:239)
	at javafx.stage.Stage.<init>(Stage.java:227)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:783)
	at com.sun.javafx.application.LauncherImpl$$Lambda$546/1165191125.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Original exception that caused the problem: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at jdk.vm.ci.hotspot.HotSpotConstantPool.loadReferencedType(HotSpotConstantPool.java:695)
	at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.loadReferencedType(WrappedConstantPool.java:58)
	at org.graalvm.compiler.java.BytecodeParser.maybeEagerlyResolve(BytecodeParser.java:3847)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.maybeEagerlyResolve(SharedGraphBuilderPhase.java:102)
	at org.graalvm.compiler.java.BytecodeParser.lookupMethod(BytecodeParser.java:3801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1380)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.genInvokeStatic(SharedGraphBuilderPhase.java:171)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:4677)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3065)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:2886)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:880)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:774)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:93)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:47)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:195)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:40)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:36)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:195)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:319)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:308)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:298)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:105)
	at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:419)
	at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:345)
	at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:387)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:498)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:172)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error: Must not have a started Thread in the image heap.
Trace: 	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Error: Must not have a started Thread in the image heap.
Trace: 	field com.sun.prism.es2.ES2Pipeline.creator
Error: Must not have a started Thread in the image heap.
Trace: 	object java.util.concurrent.ThreadPoolExecutor$Worker
	object java.util.HashMap$Node
	object java.util.HashMap$Node[]
	object java.util.HashMap
	object java.util.HashSet
	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Error: Must not have a started Thread in the image heap.
Trace: 	object java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
	object java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
	object java.util.concurrent.LinkedBlockingQueue
	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)

Error: Processing image build request failed

If you need more information, please let me know. Thanks.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions