デフォルトでuse-context-classloaderが true に設定されているのはなぜですか?
Clojure が現在のクラスローダーを使用しないのはなぜですか?
デフォルトでuse-context-classloaderが true に設定されているのはなぜですか?
Clojure が現在のクラスローダーを使用しないのはなぜですか?
clojure.lang.Compiler.LOADER
クラスローダーに設定することで、その動作をオーバーライドできます。
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 はクラスです。
しかし、RTクラスを初めて使用するとき(つまり、RTクラスがロードされるとき)、コンテキストクラスローダーを使用してロードします。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
それ以外の場合は、前者ではなくこれを行うと、次のようになります。
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 );
、最初のエラーが発生します(明らかに)