¿Por qué Clojure usa el Context Classloader por defecto?
contextclassloader (1)
¿Por qué se usa use-context-classloader en verdadero de forma predeterminada?
¿Por qué Clojure no usa el cargador de clases actual?
puede anular su comportamiento configurando clojure.lang.Compiler.LOADER
al cargador de clases, es decir.
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();
}
donde ClojurePlugin es tu clase.
pero cuando utiliza la clase RT la primera vez (es decir, cuando se carga la clase RT) utilizará el cargador de clases de contexto para cargar, es decir. clojure/core
, por lo que es posible que desee clojure/core
el código anterior en:
ClassLoader previous = Thread.currentThread().getContextClassLoader();
final ClassLoader parentClassLoader = ClojurePlugin.class.getClassLoader();
Thread.currentThread().setContextClassLoader(parentClassLoader);
try {
...
//above code here
...
} finally {
Thread.currentThread().setContextClassLoader(previous);
}
de lo contrario, te arriesgas a recibir algunos mensajes de error como:
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
de lo contrario, si haces esto pero no lo primero, obtienes algo como:
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)
si no lo hace (pero todavía llama a algo como clojure.lang.RT.loadResourceScript( cljFile );
entonces obtiene el primer error (obviamente)