【发布时间】:2011-05-14 16:49:45
【问题描述】:
这是我得到的异常的秘诀(编辑: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 的类定义,我认为这是 clojure RT 的作用,在解析相关的 .clj 源文件后立即加载。正如您在我收到的堆栈跟踪的摘录中看到的那样,正在加载 myns,并且它恰好在那里定义了 Proto。我怎么有NoClassDefFoundError?
【问题讨论】:
标签: java spring interop clojure classloader