【发布时间】:2014-11-10 16:35:21
【问题描述】:
我已经成功地将现有的 Java 项目用于我的 Scala 项目,但在使用 Java 单例时遇到了 NoClassDefFoundError:
public class SpecificUser extends BasicUser {
private static SpecificUser INSTANCE = new SpecificUser();
protected SpecificUser() { }
public static SpecificUser getInstance() {
return INSTANCE;
}
...
}
这是确切的错误:
play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser]]
at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.5.jar:2.3.5]
at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.5.jar:2.3.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:205) [play_2.11-2.3.5.jar:2.3.5]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:202) [play_2.11-2.3.5.jar:2.3.5]
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.1.jar:na]
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser
at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:523) ~[play_2.11-2.3.5.jar:2.3.5]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) ~[play_2.11-2.3.5.jar:2.3.5]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) ~[play_2.11-2.3.5.jar:2.3.5]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.3.5.jar:2.3.5]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129) ~[play_2.11-2.3.5.jar:2.3.5]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser
at controllers.UsersController$$anonfun$usersDatatable$1.apply(UsersController.scala:36) ~[classes/:na]
at controllers.UsersController$$anonfun$usersDatatable$1.apply(UsersController.scala:34) ~[classes/:na]
at controllers.security.Authentication$$anonfun$AuthenticatedAction$1.apply(AuthenticatedController.scala:21) ~[classes/:na]
at controllers.security.Authentication$$anonfun$AuthenticatedAction$1.apply(AuthenticatedController.scala:19) ~[classes/:na]
at play.api.mvc.ActionBuilder$$anonfun$apply$16.apply(Action.scala:433) ~[play_2.11-2.3.5.jar:2.3.5]
这些问题可能有助于确定在 Scala 中可能无法访问静态方法,但无助于确定可行的解决方案:
https://stackoverflow.com/a/4448069/1359765
https://stackoverflow.com/a/21303729/1359765
如何在 Scala 中使用我的单例对象?
更新
我在我正在使用的 java 依赖项目中创建了一个单例,它运行良好。问题是当单例继承自 BasicUser 时,它位于我正在使用的另一个 java 依赖项目中。
【问题讨论】:
-
确切的错误是什么以及如何编译和运行项目?这是一个混合的 Java/Scala 项目,还是依赖项中的 Java 代码?
-
我用激活器编译和运行项目。它不是一个混合的 java/scala 项目,一个 java 项目被用作 Scala Play 项目的依赖项
-
尝试使用与 java 类相同的配置。问题是,SpecificUser 类在静态块中有异常(在超类中)。在调试模式下检查所有未捕获的异常。
-
@AndrzejJozwik - 尝试使用 java 类中的相同配置是什么意思?我正在使用带有原始配置的 java 类。我尝试在调试模式下检查未捕获的异常,但问题是当我尝试介入并使用 getInstance() 方法时,调试器会转到诸如 Action.scala 之类的 scala 类文件,然后播放线程
-
@jwill 如果所有静态块的初始化成功完成,则该类将加载到虚拟机。如果至少有一个失败 - 未加载该类。
标签: java scala singleton sbt scala-2.11