Reputation: 1369
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
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
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