aganm
aganm

Reputation: 1369

Java AWT in scala: (AWT-EventQueue-0) java.lang.NoClassDefFoundError

I'm trying to use java awt in scala to make a simple desktop application. I have been working on it for some days without any problem, until I didn't touch it for 2 days and when I came back, I get a java.lang.NoClassDefFoundError exception. It was working fine before, but now even the simplest of code gives me this error.

https://github.com/aganm/NoClassDefFoundError

Main.scala

import java.awt.{EventQueue}

class Bar(val bar: Int) {
}

object Main {

  def main(args: Array[String]) {

    EventQueue.invokeLater(() => {
      val b = new Bar(20)
      println(b.bar)
    });

  }

}

I run it with sbt

sbt run

It compiles, but I get this exception

[error] (AWT-EventQueue-0) java.lang.NoClassDefFoundError: Bar
[error] java.lang.NoClassDefFoundError: Bar
[error]         at Main$.$anonfun$main$1(Main.scala:11)
[error]         at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
[error] oats / Cat java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
[error]         at java.awt.EventQueue.access$500(EventQueue.java:97)
[error]         at java.awt.EventQueue$3.run(EventQueue.java:709)
[error]         at java.awt.EventQueue$3.run(EventQueue.java:703)
[error]         at java.security.AccessController.doPrivileged(Native Method)
[error]         at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
[error]         at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
[error]         at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
[error]         at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
[error]         at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
[error]         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
[error]         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
[error]         at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[error] Caused by: java.lang.ClassNotFoundException: Bar
[error]         at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
[error]         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]         at Main$.$anonfun$main$1(Main.scala:11)
[error]         at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
[error]         at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
[error]         at java.awt.EventQueue.access$500(EventQueue.java:97)
[error]         at java.awt.EventQueue$3.run(EventQueue.java:709)
[error]         at java.awt.EventQueue$3.run(EventQueue.java:703)
[error]         at java.security.AccessController.doPrivileged(Native Method)
[error]         at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
[error]         at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
[error]         at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
[error]         at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
[error]         at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
[error]         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
[error]         at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
[error]         at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
[error] stack trace is suppressed; run last Compile / bgRun for the full output

What am I doing wrong?

Upvotes: 1

Views: 841

Answers (2)

Suma
Suma

Reputation: 34393

I suspect a SBT bug. I can reproduce the issue with SBT 1.3.0, but not with SBT 1.2.8. Also I do not reproduce the issue when I add fork := true into the build.sbt file even when using SBT 1.3.0. You can use any of those options as a workaround.

I have reported the issue as Strange NoClassDefFoundError error with SBT 1.3.0 and it is now fixed in SBT 1.3.2.

The 1.3.0 new functionality seems to be In process class loading - however none of the values described seems to fix the issue, therefore I am not sure if it really related.

Upvotes: 2

Eugene Yokota
Eugene Yokota

Reputation: 95604

It is in fact related to an issue of sbt 1.3.0's stricter ClassLoader and thread management during run task, which should be fixed in the next patch release.

In the meantime however, forking does work:

Compile/ run / fork := true

Here's the output:

sbt:NoClassDefFoundError> run
[info] running (fork) Main
[info] 20
[success] Total time: 2 s, completed Sep 17, 2019 11:29:04 AM

I think the related bug is [1.3.0] not terminating ActorSystem leads to NoClassDefFoundError at the end of run as sbt cleans up the ClassLoader #5075. In your case, EventDispatchThread keeps running even after Main.main is exited. sbt cleans after the run and removes the ClassLoader (which has your classes in it), so when EventDispatchThread runs it can no longer find your classes.

Close in-process classloader only once run has completed #5081, hopefully fixes this issue.

Upvotes: 1

Related Questions