I tried to compile my Akka sample project with Scala (here) successfully, but running failed, cause a java.lang.ClassNotFoundException.
How to reproduction:
sbt graalvm-native-image:packageBin under the project directory with native image options belowgraalVMNativeImageOptions ++= Seq(
"--report-unsupported-elements-at-runtime",
"-H:+ReportExceptionStackTraces",
"--verbose",
"--initialize-at-build-time",
"--no-fallback",
)
./graalvm-akka under target directoryError message:
Exception in thread "main" java.lang.ClassNotFoundException: akka.event.DefaultLoggingFilter
at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:60)
at java.lang.Class.forName(DynamicHub.java:1158)
at akka.actor.ReflectiveDynamicAccess.$anonfun$getClassFor$1(ReflectiveDynamicAccess.scala:22)
at scala.util.Try$.apply(Try.scala:213)
at akka.actor.ReflectiveDynamicAccess.getClassFor(ReflectiveDynamicAccess.scala:21)
at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:39)
at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:780)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:246)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:289)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:264)
at graalvm.akka.Main$.main(Main.scala:21)
at graalvm.akka.Main.main(Main.scala)
My OS is macOS Mojave 10.14.5,
Both graalvm CE and native-image version is 19.1.1.
Thanks.
It looks like you need to register akka.event.DefaultLoggingFilter for reflection. You can automate the discovery of the reflectivelly accessed elements via the native-image-agent.
Thanks @cstancu .I tried native-image-agent with below command, but no files are generated in the config-output-dir directory. Any suggestions?
$java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-20190711112007.graal.jdk8u-src-tar-gz-b08)
OpenJDK 64-Bit GraalVM CE 19.1.1 (build 25.222-b08-jvmci-19.1-b01, mixed mode)
$java -cp graalvm-akka.jar graalvm.akka.Main -agentlib:native-image-agent=config-output-dir=/work/code/github/graalvm-akka/
...
And I configured reflection class manually using reflect-config.json, but I got other error below during compilation.
reflect-config.json:
[
{
"name" : "akka.event.DefaultLoggingFilter",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
},
{
"name" : "akka.actor.LightArrayRevolverScheduler",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
}
]
Error message:
[info] Warning: RecomputeFieldValue.FieldOffset automatic substitution failed. The automatic substitution registration was attempted because a call to sun.misc.Unsafe.objectFieldOffset(Field) was detected in the static initializer of akka.actor.LightArrayRevolverScheduler$. Detailed failure reason(s): The field akka.actor.LightArrayRevolverScheduler$.akka$actor$LightArrayRevolverScheduler$$taskOffset, where the value produced by the field offset computation is stored, is not static.
[info] [graalvm-akka:15957] analysis: 7,108.66 ms
[error] Error: Error encountered while parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(java.lang.Runnable)
[error] Parsing context:
[error] parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.cancel(LightArrayRevolverScheduler.scala:339)
[error] parsing akka.actor.LightArrayRevolverScheduler.akka$actor$LightArrayRevolverScheduler$$schedule(LightArrayRevolverScheduler.scala:173)
[error] parsing akka.actor.LightArrayRevolverScheduler.scheduleOnce(LightArrayRevolverScheduler.scala:134)
[error] parsing akka.dispatch.MessageDispatcher.akka$dispatch$MessageDispatcher$$scheduleShutdownAction(AbstractDispatcher.scala:174)
[error] parsing akka.dispatch.MessageDispatcher$$anon$3.run(AbstractDispatcher.scala:224)
[error] parsing java.lang.Shutdown.runHooks(Shutdown.java:123)
[error] parsing java.lang.Shutdown.sequence(Shutdown.java:167)
[error] parsing java.lang.Shutdown.shutdown(Shutdown.java:234)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:181)
[error] parsing com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:172)
[error] parsing com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)
[error] com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(java.lang.Runnable)
[error] Parsing context:
[error] parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.cancel(LightArrayRevolverScheduler.scala:339)
[error] parsing akka.actor.LightArrayRevolverScheduler.akka$actor$LightArrayRevolverScheduler$$schedule(LightArrayRevolverScheduler.scala:173)
[error] parsing akka.actor.LightArrayRevolverScheduler.scheduleOnce(LightArrayRevolverScheduler.scala:134)
[error] parsing akka.dispatch.MessageDispatcher.akka$dispatch$MessageDispatcher$$scheduleShutdownAction(AbstractDispatcher.scala:174)
[error] parsing akka.dispatch.MessageDispatcher$$anon$3.run(AbstractDispatcher.scala:224)
[error] parsing java.lang.Shutdown.runHooks(Shutdown.java:123)
[error] parsing java.lang.Shutdown.sequence(Shutdown.java:167)
[error] parsing java.lang.Shutdown.shutdown(Shutdown.java:234)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:181)
[error] parsing com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:172)
[error] parsing com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)
[error] at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:327)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
[error] at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:421)
[error] at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:343)
[error] at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:385)
[error] at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510)
[error] at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)
[error] at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[error] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[error] at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[error] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[error] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[error] Caused by: com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder$UnsafeOffsetError: Field AnalysisField<LightArrayRevolverScheduler$.akka$actor$LightArrayRevolverScheduler$$taskOffset accessed: false reads: true written: false> is used as an offset in an unsafe operation, but no value recomputation found.
[error] Wrapped field: HotSpotResolvedJavaFieldImpl<akka.actor.LightArrayRevolverScheduler$.akka$actor$LightArrayRevolverScheduler$$taskOffset long:16>
[error] Location: at akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(LightArrayRevolverScheduler.scala:321) [bci: 113]
[error] at com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder$UnsafeOffsetError.report(SVMMethodTypeFlowBuilder.java:119)
[error] at com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder.checkUnsafeOffset(SVMMethodTypeFlowBuilder.java:161)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder$NodeIterator.node(MethodTypeFlowBuilder.java:1096)
[error] at org.graalvm.compiler.phases.graph.PostOrderNodeIterator.apply(PostOrderNodeIterator.java:106)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:421)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
[error] ... 12 more
[error] Error: Error encountered while parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(java.lang.Runnable)
[error] Parsing context:
[error] parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.run(LightArrayRevolverScheduler.scala:337)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
[error] parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)
[error] com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(java.lang.Runnable)
[error] Parsing context:
[error] parsing akka.actor.LightArrayRevolverScheduler$TaskHolder.run(LightArrayRevolverScheduler.scala:337)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.executeHooks(RuntimeSupport.java:144)
[error] parsing com.oracle.svm.core.jdk.RuntimeSupport.executeTearDownHooks(RuntimeSupport.java:121)
[error] parsing com.oracle.svm.core.graal.snippets.CEntryPointSnippets.tearDownIsolate(CEntryPointSnippets.java:300)
[error] at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:327)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
[error] at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:421)
[error] at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:343)
[error] at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:385)
[error] at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510)
[error] at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)
[error] at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[error] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[error] at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[error] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[error] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[error] Caused by: com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder$UnsafeOffsetError: Field AnalysisField<LightArrayRevolverScheduler$.akka$actor$LightArrayRevolverScheduler$$taskOffset accessed: false reads: true written: false> is used as an offset in an unsafe operation, but no value recomputation found.
[error] Wrapped field: HotSpotResolvedJavaFieldImpl<akka.actor.LightArrayRevolverScheduler$.akka$actor$LightArrayRevolverScheduler$$taskOffset long:16>
[error] Location: at akka.actor.LightArrayRevolverScheduler$TaskHolder.extractTask(LightArrayRevolverScheduler.scala:321) [bci: 113]
[error] at com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder$UnsafeOffsetError.report(SVMMethodTypeFlowBuilder.java:119)
[error] at com.oracle.svm.hosted.analysis.flow.SVMMethodTypeFlowBuilder.checkUnsafeOffset(SVMMethodTypeFlowBuilder.java:161)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder$NodeIterator.node(MethodTypeFlowBuilder.java:1096)
[error] at org.graalvm.compiler.phases.graph.PostOrderNodeIterator.apply(PostOrderNodeIterator.java:106)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:421)
[error] at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
[error] ... 12 more
[error] Error: Image build request failed with exit status 1
[error] com.oracle.svm.driver.NativeImage$NativeImageError: Image build request failed with exit status 1
[error] at com.oracle.svm.driver.NativeImage.showError(NativeImage.java:1405)
[error] at com.oracle.svm.driver.NativeImage.build(NativeImage.java:1183)
[error] at com.oracle.svm.driver.NativeImage.performBuild(NativeImage.java:1145)
[error] at com.oracle.svm.driver.NativeImage.main(NativeImage.java:1104)
[error] java.lang.RuntimeException: Failed to run native-image, exit status: 1
[error] at scala.sys.package$.error(package.scala:26)
[error] at com.typesafe.sbt.packager.graalvmnativeimage.GraalVMNativeImagePlugin$.$anonfun$projectSettings$3(GraalVMNativeImagePlugin.scala:52)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error] at sbt.std.Transform$$anon$4.work(System.scala:67)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] at sbt.Execute.work(Execute.scala:278)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] (Graalvm-native-image / packageBin) Failed to run native-image, exit status: 1
@deanzz
$java -cp graalvm-akka.jar graalvm.akka.Main -agentlib:native-image-agent=config-output-dir=/work/code/github/graalvm-akka/
One thing looks really odd - you're putting VM parameters as main class arguments.
$ java
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)
You have to put VM options before main class name or JAR path.
@cstancu
Maybe it's worth specifying on https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md that -agentlib must come before main class name or JAR path? It's not the first time people are complaining that native-image-agent doesn't generate anything.
@tarsa Thanks.
The native-image-agent works now by below command.
java -agentlib:native-image-agent=config-output-dir=/work/code/github/graalvm-akka/src/resources/ -cp graalvm-akka.jar graalvm.akka.Main
@deanzz it sounds like your application can execute successfully now. I'll close this issue.
@tarsa thanks for the suggestion, we will emphasize the correct position of the -agentlib argument in the docs.
Most helpful comment
It looks like you need to register
akka.event.DefaultLoggingFilterfor reflection. You can automate the discovery of the reflectivelly accessed elements via the native-image-agent.