Graal: Compiled to native image which uses Akka successfully but running failed

Created on 26 Jul 2019  路  8Comments  路  Source: oracle/graal

I tried to compile my Akka sample project with Scala (here) successfully, but running failed, cause a java.lang.ClassNotFoundException.

How to reproduction:

  1. Clone project from here
  2. Run sbt graalvm-native-image:packageBin under the project directory with native image options below
graalVMNativeImageOptions ++= Seq(
  "--report-unsupported-elements-at-runtime",
  "-H:+ReportExceptionStackTraces",
  "--verbose",
  "--initialize-at-build-time",
  "--no-fallback",
)
  1. Copy the configuration of Akka under akka-actor_2.12-2.5.21.jar (reference.conf and version.conf) to the target directory "target/graalvm-native-image"
  2. Run ./graalvm-akka under target directory

Error 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.

native-image

Most helpful comment

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.

All 8 comments

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

The problem that running failed was resolved by the repository here that it publishes artifacts that can be used for building Akka projects with native-image without supplying the whole configuration in the project itself.

Please refer to here for the sample code.

@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.

Was this page helpful?
0 / 5 - 0 ratings