需要其命名空间时协议上的NoClassDefFoundError

时间:2011-05-14 16:49:46

标签: java spring interop clojure classloader

这是我得到的异常的配方(编辑:ProtoImpl在另一个ns中定义,我将其留下以简化描述):

myns.clj

(ns myns)

(defprotocol Proto
  (func [this]))

(extend-protocol Proto
  ProtoImpl
  (func [this] (do-something ...)))

interop.clj

(ns interop
  (:require [myns :as m]))

(defn startup
  []
  (m/func (ProtoImpl.)))

(gen-class :name interop.Interop
           :prefix "interop-"
           :methods [[boot [] void]])

(defn interop-boot
  [this]
  (startup)))

myns.clj和interop.clj都是在webapp中发布的,后者也是AOT编译的,因此可以立即在类路径中生成Interop.class。这被实例化为Spring bean。

当webapp启动时,它无法引导,但出现以下异常:

[...]
    at myns__init.load(Unknown Source)
    at myns__init.<clinit>(Unknown Source)
[...]
    at interop.Interop.<clinit>(Unknown Source)
[...]
Caused by: NoClassDefFoundError: myns.Proto

可能导致此问题的原因是什么?


编辑:我再也无法重现错误了,我重新编译并重新运行应用程序,它完美启动......但我真的很想了解这样的问题可以在哪些情况下显示起来。

在我看来,类加载器找不到Proto的类定义,我假设一旦解析了相关的.clj源文件,就会加载clojure RT的角色。正如您在我收到的堆栈跟踪的摘录中看到的那样,正在加载myns,并且正好在那里定义了Proto。我怎么得到NoClassDefFoundError

2 个答案:

答案 0 :(得分:1)

Clojure Records应该是导入的。以下应该有效:

(ns interop
  (:require [myns :as m])
  (:import  myns.Proto))

答案 1 :(得分:0)

我遇到了同样的问题。在我的:aot中将这两个类添加到project.clj解决了这个问题。您的project.clj会有类似这样的内容::aot [myns interop]

相关问题