为什么Clojure默认使用上下文类加载器?

为什么Clojure默认使用上下文类加载器?,clojure,classloader,contextclassloader,Clojure,Classloader,Contextclassloader,为什么use context classloader默认设置为true 为什么Clojure不使用当前的类加载器?您可以通过将Clojure.lang.Compiler.loader设置为类加载器来覆盖其行为 即 ClojurePlugin是你的班级 但是,当您第一次使用RT类时(即加载RT类时),它将使用上下文类加载器加载ie。clojure/core,因此您可能希望将上述代码包装成: ClassLoader previous = Thread.currentThread().getConte

为什么use context classloader默认设置为true


为什么Clojure不使用当前的类加载器?

您可以通过将
Clojure.lang.Compiler.loader
设置为类加载器来覆盖其行为 即

ClojurePlugin是你的班级

但是,当您第一次使用RT类时(即加载RT类时),它将使用上下文类加载器加载ie。
clojure/core
,因此您可能希望将上述代码包装成:

ClassLoader previous = Thread.currentThread().getContextClassLoader();
final ClassLoader parentClassLoader = ClojurePlugin.class.getClassLoader();
Thread.currentThread().setContextClassLoader(parentClassLoader);
try {
  ...
  //above code here
  ...
} finally {
  Thread.currentThread().setContextClassLoader(previous);
}
否则您可能会收到一些错误消息,如:

Caused by: java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath:
        at clojure.lang.RT.load(RT.java:432)
        at clojure.lang.RT.load(RT.java:400)
        at clojure.lang.RT.doInit(RT.java:436)
        at clojure.lang.RT.<clinit>(RT.java:318)
        ... 16 more

如果两者都不做(但仍然调用类似于
clojure.lang.RT.loadResourceScript(cljFile);
的东西,则会出现第一个错误(显然)

现在就通读这篇文章:这对我来说是一个有趣的话题,作者得出的结论是,上下文类加载器不太可能被框架覆盖,从而使行为更可预测。我将把这个问题的答案留给真正知道的人。我实际上使用了不同的ccl(不是来自类的):final clojure.lang.DynamicClassLoader ccl=(clojure.lang.DynamicClassLoader)AccessController.doPrivileged(新PrivilegedAction(){@Override public Object run(){返回新clojure.lang.DynamicClassLoader(ClojurePlugin.class.getClassLoader();});我后来通过ccl.addURL(jarURL)将jar文件添加到其类路径中;有趣的解决方案。我最终修改了Clojure本身的源代码,将类加载器更改为当前类加载器,而不是上下文类加载器:
Caused by: java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath:
        at clojure.lang.RT.load(RT.java:432)
        at clojure.lang.RT.load(RT.java:400)
        at clojure.lang.RT.doInit(RT.java:436)
        at clojure.lang.RT.<clinit>(RT.java:318)
        ... 16 more
21:10:59 [SEVERE] java.io.FileNotFoundException: Could not locate Clojure resource on classpath: cljminecraft/core.clj
21:10:59 [SEVERE]       at clojure.lang.RT.loadResourceScript(RT.java:366)
21:10:59 [SEVERE]       at clojure.lang.RT.loadResourceScript(RT.java:346)
21:10:59 [SEVERE]       at clojure.lang.RT.loadResourceScript(RT.java:338)
21:10:59 [SEVERE]       at cljminecraft.ClojurePlugin.loadClojureFile(ClojurePlugin.java:25)
21:10:59 [SEVERE]       at cljminecraft.ClojurePlugin.loadClojureNameSpace(ClojurePlugin.java:38)
21:10:59 [SEVERE]       at cljminecraft.ClojurePlugin.start(ClojurePlugin.java:53)
21:10:59 [SEVERE]       at cljminecraft.BasePlugin.onEnable(BasePlugin.java:235)
21:10:59 [SEVERE]       at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
21:10:59 [SEVERE]       at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:374)
21:10:59 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
21:10:59 [SEVERE]       at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:270)
21:10:59 [SEVERE]       at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:252)
21:10:59 [SEVERE]       at net.minecraft.server.MinecraftServer.j(MinecraftServer.java:320)
21:10:59 [SEVERE]       at net.minecraft.server.MinecraftServer.e(MinecraftServer.java:299)
21:10:59 [SEVERE]       at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:258)
21:10:59 [SEVERE]       at net.minecraft.server.DedicatedServer.init(DedicatedServer.java:147)
21:10:59 [SEVERE]       at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:398)
21:10:59 [SEVERE]       at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)