clojure:命名空间中的ExceptionInInitializerError错误。<;初始化>;从非默认类路径加载
在尝试从非默认类路径加载AOT编译的类时,我收到以下异常:clojure:命名空间中的ExceptionInInitializerError错误。<;初始化>;从非默认类路径加载,clojure,classloader,Clojure,Classloader,在尝试从非默认类路径加载AOT编译的类时,我收到以下异常: Traceback (innermost last): File "test.jy", line 10, in ? at clojure.lang.Namespace.<init>(Namespace.java:34) at clojure.lang.Namespace.findOrCreate(Namespace.java:176) at clojure.lang.Var
Traceback (innermost last):
File "test.jy", line 10, in ?
at clojure.lang.Namespace.<init>(Namespace.java:34)
at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
at clojure.lang.Var.internPrivate(Var.java:149)
at aot_demo.JavaClass.<clinit>(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
java.lang.ExceptionInInitializerError: java.lang.ExceptionInInitializerError
…和src/aot_demo/core.clj
定义如下:
(ns aot-demo.core
(:gen-class
:name aot_demo.JavaClass
:methods [#^{:static true} [lower [java.lang.String] java.lang.String]]))
(defn -lower [str] (.toLowerCase str))
下面的Jython脚本足以触发该错误:
#!/usr/bin/jython
import java.lang.Class
import java.net.URLClassLoader
import java.net.URL
import os
customLoader = java.net.URLClassLoader(
[java.net.URL('file://%s/target/aot-demo-0.1.0-SNAPSHOT-standalone.jar'
% (os.getcwd()))])
java.lang.Class.forName('aot_demo.JavaClass', True, customLoader)
但是,如果在启动测试脚本时,uberjar已经在CLASSPATH
变量中,则不会发生异常
这是怎么回事?我正试图在Clojure中为BaseX数据库编写一个插件;上面准确地描述了他们的插件加载机制如何为这个问题提供SSCE。BaseX使用的插件加载机制应该扩展以修改当前线程的上下文类加载器。对于给定的示例代码(在Jython中),如下所示:
currentThread = java.lang.Thread.currentThread()
oldLoader = currentThread.getContextClassLoader()
currentThread.setContextClassLoader(customLoader)
try:
cls = java.lang.Class.forName('aot_demo.JavaClass', True, customLoader)
finally:
currentThread.setContextClassLoader(oldLoader)
看起来这是CLJ-260,“决议:拒绝”。
currentThread = java.lang.Thread.currentThread()
oldLoader = currentThread.getContextClassLoader()
currentThread.setContextClassLoader(customLoader)
try:
cls = java.lang.Class.forName('aot_demo.JavaClass', True, customLoader)
finally:
currentThread.setContextClassLoader(oldLoader)