> OK, I skimmed through compile and RT and it seems as if you "just"
> needed to construct a proper URLClassLoader with the directories you
> need on the classpath, set this one as the context classloader and set
> *use-context-classloader* to true before you invoke compile.
Yes, works. The attached patch ensures that clojure.compile.path
exists (it doesn't ensure it is a directory, should it?), sets up a
classloader that contains it and runs compile successfully when
invoked for a non-existant target directory.
I haven't changed the handling of the source directories, but it would
probably only be a matter of adding them to the same classloader as
well.
Stefan
BTW, should Var.popThreadBindings(); in Compile be moved into the
finally block?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---
Index: src/jvm/clojure/lang/Compile.java
===================================================================
--- src/jvm/clojure/lang/Compile.java (revision 1127)
+++ src/jvm/clojure/lang/Compile.java (working copy)
@@ -14,6 +14,9 @@
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.IOException;
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
// Compiles libs and generates class files stored within the directory
// named by the Java System property "clojure.compile.path". Arguments are
@@ -41,9 +44,22 @@
System.exit(1);
}
+ File destdir = new File(path);
+ if (!destdir.exists()) {
+ destdir.mkdirs();
+ }
+ ClassLoader currentContextLoader =
+ Thread.currentThread().getContextClassLoader();
+ URLClassLoader loader =
+ new URLClassLoader(new URL[] {destdir.toURL()},
+ currentContextLoader);
+
try
{
Var.pushThreadBindings(RT.map(compile_path, path));
+ Var.pushThreadBindings(RT.map(RT.USE_CONTEXT_CLASSLOADER,
+ Boolean.TRUE));
+ Thread.currentThread().setContextClassLoader(loader);
out.write("Compiling " + count + " " +
((count == 1) ? "lib" : "libs") +
@@ -57,6 +73,8 @@
}
finally
{
+ Thread.currentThread()
+ .setContextClassLoader(currentContextLoader);
try
{
out.flush();