Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure:命名空间中的ExceptionInInitializerError错误。<;初始化>;从非默认类路径加载_Clojure_Classloader - Fatal编程技术网

clojure:命名空间中的ExceptionInInitializerError错误。<;初始化>;从非默认类路径加载

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

在尝试从非默认类路径加载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.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)