Java AWT 规模化:(AWT-EventQueue-0) java.lang.NoClassDefFoundError
Java AWT in scala: (AWT-EventQueue-0) java.lang.NoClassDefFoundError
我正在尝试在 scala 中使用 java awt 来制作一个简单的桌面应用程序。我已经在它上面工作了几天,没有任何问题,直到我有 2 天没有碰它,当我回来时,我得到一个 java.lang.NoClassDefFoundError 异常。之前它工作正常,但现在即使是最简单的代码也会给我这个错误。
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)
});
}
}
我运行它与sbt
sbt run
可以编译,但是我得到这个异常
[error] (AWT-EventQueue-0) java.lang.NoClassDefFoundError: Bar
[error] java.lang.NoClassDefFoundError: Bar
[error] at Main$.$anonfun$main(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.access0(EventQueue.java:97)
[error] at java.awt.EventQueue.run(EventQueue.java:709)
[error] at java.awt.EventQueue.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(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.access0(EventQueue.java:97)
[error] at java.awt.EventQueue.run(EventQueue.java:709)
[error] at java.awt.EventQueue.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
我做错了什么?
我怀疑是 SBT 错误。我可以使用 SBT 1.3.0 重现该问题,但不能使用 SBT 1.2.8。此外,当我将 fork := true
添加到 build.sbt
文件时,即使使用 SBT 1.3.0,我也不会重现该问题。您可以使用这些选项中的任何一个作为解决方法。
我已将此问题报告为 Strange NoClassDefFoundError error with SBT 1.3.0,现在已在 SBT 1.3.2 中修复。
1.3.0 的新功能似乎是 In process class loading - 然而 none 描述的值似乎解决了这个问题,因此我不确定它是否真的相关。
这实际上与 sbt 1.3.0 在 run
任务期间更严格的 ClassLoader 和线程管理有关,应该在下一个补丁版本中修复。
与此同时,分叉确实有效:
Compile/ run / fork := true
这是输出:
sbt:NoClassDefFoundError> run
[info] running (fork) Main
[info] 20
[success] Total time: 2 s, completed Sep 17, 2019 11:29:04 AM
我认为相关的错误是 [1.3.0] not terminating ActorSystem leads to NoClassDefFoundError
at the end of run
as sbt cleans up the ClassLoader #5075。在您的情况下,EventDispatchThread
即使在 Main.main
退出后也会保留 运行。 sbt 在 run
之后清理并删除 ClassLoader(里面有你的 类),所以当 EventDispatchThread
运行时它不再能找到你的 类.
Close in-process classloader only once run has completed #5081,希望能解决这个问题。
我正在尝试在 scala 中使用 java awt 来制作一个简单的桌面应用程序。我已经在它上面工作了几天,没有任何问题,直到我有 2 天没有碰它,当我回来时,我得到一个 java.lang.NoClassDefFoundError 异常。之前它工作正常,但现在即使是最简单的代码也会给我这个错误。
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)
});
}
}
我运行它与sbt
sbt run
可以编译,但是我得到这个异常
[error] (AWT-EventQueue-0) java.lang.NoClassDefFoundError: Bar
[error] java.lang.NoClassDefFoundError: Bar
[error] at Main$.$anonfun$main(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.access0(EventQueue.java:97)
[error] at java.awt.EventQueue.run(EventQueue.java:709)
[error] at java.awt.EventQueue.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(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.access0(EventQueue.java:97)
[error] at java.awt.EventQueue.run(EventQueue.java:709)
[error] at java.awt.EventQueue.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
我做错了什么?
我怀疑是 SBT 错误。我可以使用 SBT 1.3.0 重现该问题,但不能使用 SBT 1.2.8。此外,当我将 fork := true
添加到 build.sbt
文件时,即使使用 SBT 1.3.0,我也不会重现该问题。您可以使用这些选项中的任何一个作为解决方法。
我已将此问题报告为 Strange NoClassDefFoundError error with SBT 1.3.0,现在已在 SBT 1.3.2 中修复。
1.3.0 的新功能似乎是 In process class loading - 然而 none 描述的值似乎解决了这个问题,因此我不确定它是否真的相关。
这实际上与 sbt 1.3.0 在 run
任务期间更严格的 ClassLoader 和线程管理有关,应该在下一个补丁版本中修复。
与此同时,分叉确实有效:
Compile/ run / fork := true
这是输出:
sbt:NoClassDefFoundError> run
[info] running (fork) Main
[info] 20
[success] Total time: 2 s, completed Sep 17, 2019 11:29:04 AM
我认为相关的错误是 [1.3.0] not terminating ActorSystem leads to NoClassDefFoundError
at the end of run
as sbt cleans up the ClassLoader #5075。在您的情况下,EventDispatchThread
即使在 Main.main
退出后也会保留 运行。 sbt 在 run
之后清理并删除 ClassLoader(里面有你的 类),所以当 EventDispatchThread
运行时它不再能找到你的 类.
Close in-process classloader only once run has completed #5081,希望能解决这个问题。