Skip to content

native-image fails to compile fat-jar of scala-2.12.6 project #1689

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
smabie opened this issue Sep 17, 2019 · 1 comment
Closed

native-image fails to compile fat-jar of scala-2.12.6 project #1689

smabie opened this issue Sep 17, 2019 · 1 comment
Assignees

Comments

@smabie
Copy link

smabie commented Sep 17, 2019

I run with:
$ native-image -H:+ReportExceptionStackTraces -jar metaswarm-assembly-0.1.jar run

And the output is:

Build on Server(pid: 7945, port: 46753)                                                                                              
[run:7945]    classlist:   9,237.07 ms                                                                                               
[run:7945]        (cap):     603.49 ms                                                                                               
[run:7945]        setup:     924.41 ms                                                                                               
[run:7945]     analysis:   2,636.08 ms                                                                                               
Error: Error encountered while parsing metaswarm.Main$.<init>()                                                                      
Parsing context:                                                                                                                     
        parsing metaswarm.Main$.<clinit>(Main.scala)                                                                                 
                                                                                                                                     
com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing metaswarm.Main$.<init>()                  
Parsing context:                                                                                                                     
        parsing metaswarm.Main$.<clinit>(Main.scala)                                                                                 
                                                                                                                                     
        at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)                                         
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:323)                                            
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)                                       
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)                                         
        at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:421)                            
        at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:343)                                                
        at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:385)                                                         
        at com.oracle.graal.pointsto.flow.SourceTypeFlowBase.update(SourceTypeFlowBase.java:121)                                     
        at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:510)                                                                 
        at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:171)                           
        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)
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: java.lang.IncompatibleClassChangeError: metaswarm.Main and $
etaswarm.Main$delayedInit$body disagree on InnerClasses attribute
        at parsing metaswarm.Main$.<init>(Main.scala:24)
        at org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2470)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:9$
)
        at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3272)
        at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3074)
        at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:976)
        at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:870)
        at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
        at org.graalvm.compiler.phases.Phase.run(Phase.java:49)
        at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197)
        at org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
        at org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:221)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:340)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
        ... 13 more
Caused by: java.lang.IncompatibleClassChangeError: metaswarm.Main and metaswarm.Main$delayedInit$body disagree on InnerClasses attrib
ute
        at java.lang.Class.getDeclaringClass0(Native Method)
        at java.lang.Class.getDeclaringClass(Class.java:1235)
        at java.lang.Class.getEnclosingClass(Class.java:1277)
        at jdk.vm.ci.hotspot.HotSpotJDKReflection.getEnclosingClass(HotSpotJDKReflection.java:106)
        at jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.getEnclosingType(HotSpotResolvedObjectTypeImpl.java:932)
        at jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.getEnclosingType(HotSpotResolvedObjectTypeImpl.java:60)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.createType(AnalysisUniverse.java:294)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookupAllowUnresolved(AnalysisUniverse.java:203)
        at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.lookupType(WrappedConstantPool.java:155)
        at org.graalvm.compiler.java.BytecodeParser.lookupType(BytecodeParser.java:4080)
        at org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4330)
        at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5128)
        at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3267)
        ... 24 more
Error: Image build request failed with exit status 1

The Main object is defined as:

object Main extends App {
  val conf = ConfigFactory.load(ConfigFactory.parseFile(File("/home/sturm/akbt/application.conf").toJava))

  implicit val system: ActorSystem = ActorSystem("tracker", conf)
  val path = "/home/sturm/misc/test.mkv.torrent"

  val supervisor = system.actorOf(Props(new ListenerSupervisor()), "listener-supervisor")
  supervisor ! ListenerSupervisor.Start

  implicit val timeout = Timeout(5 seconds)
  for {
    (trackerListener: ActorRef, peerListener: ActorRef) <- supervisor ? ListenerSupervisor.GetListenerRefs
  } yield {
    val torrent = system.actorOf(Props(new Torrent(torrentPath = path, filePath = "/home/sturm/tmp/", trackerListener,
      peerListener)),
      "torrent")
    torrent ! Torrent.Start
  }

  while(true) {
    Thread.sleep(500)
  }
}
@cstancu
Copy link
Member

cstancu commented Sep 18, 2019

This is a Scala compiler bug: scala/bug#10487 that should have been fixed by scala/scala#6788. You may need to use a newer Scala version. A similar issue was reported in #384 which also proposed the use of

object Main {
  def main(args: Array[String]): Unit = {
  }
}

instead of

object Main extends App {
 }

as an workaround.

@cstancu cstancu closed this as completed Sep 18, 2019
CedricGatay added a commit to CedricGatay/client-samples that referenced this issue Oct 24, 2019
Removed java fx dependency and try to build only with graalvm:

Results are:

  * do not build properly as it fails with ` java.lang.IncompatibleClassChangeError: akka.actor.dungeon.ChildrenContainer and akka.actor.dungeon.ChildrenContainer$EmptyChildrenContainer$class disagree on InnerClasses attribute` which seems to be related to oracle/graal#1689. ALAS the answer to this is migrating to scala >= 2.12.7 where the compiler has the bug fixed.

Next try : bump to scala 2.12 / akka 2.5.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants