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

编程入门 行业动态 更新时间:2024-10-19 03:26:31
本文介绍了为什么 Clojure 默认使用上下文类加载器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Why is use-context-classloader set to true by default?

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

Why doesn't Clojure use the current class loader?

推荐答案

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

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 类时),它将使用上下文类加载器来加载即.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屋!

更多推荐

[db:关键词]

本文发布于:2023-03-27 08:28:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/686652.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上下文   加载   Clojure

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!