为什么Clojure默认使用上下文类加载器? [英] Why Does Clojure Use the Context Classloader by Default?
问题描述
为什么默认情况下将use-context-classloader设置为true
Why is use-context-classloader set to true by default?
为什么Clojure不使用当前的类加载器? / p>
Why doesn't Clojure use the current class loader?
推荐答案
您可以通过设置 clojure.lang.Compiler.LOADER
to the class loader
ie。
you can override its behavior by setting clojure.lang.Compiler.LOADER
to the class loader
ie.
final ClassLoader ccl= ClojurePlugin.class.getClassLoader();
clojure.lang.Var.pushThreadBindings(clojure.lang.RT.map( clojure.lang.Compiler.LOADER, ccl) );
try {
...
clojure.lang.RT.loadResourceScript( cljFile );
...
}finally{
clojure.lang.RT.popThreadBindings();
}
其中ClojurePlugin是您的类。
where ClojurePlugin is your class.
但是当你第一次使用RT类(即当RT类加载时),它将使用上下文类加载器加载ie。 clojure / core
,因此您可能想将上述代码包装到
but when you're using RT class the first time ever(ie. when RT class is loaded) it will use context classloader to load ie. clojure/core
, so you might want to wrap the above code into:
ClassLoader previous = Thread.currentThread().getContextClassLoader();
final ClassLoader parentClassLoader = ClojurePlugin.class.getClassLoader();
Thread.currentThread().setContextClassLoader(parentClassLoader);
try {
...
//above code here
...
} finally {
Thread.currentThread().setContextClassLoader(previous);
}
否则您可能会收到一些错误消息:
else you risk getting some error messages like:
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
否则,如果你这样做,但不是前者,你会得到类似的东西:
otherwise if you do this but not the former, you get something like:
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)
如果你不这么做(但你仍然调用 clojure.lang.RT.loadResourceScript(cljFile);
然后你得到第一个错误)
if you do neither (but you still call something like clojure.lang.RT.loadResourceScript( cljFile );
then you get the first error (obviously)
这篇关于为什么Clojure默认使用上下文类加载器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!