Skip to content

Instantly share code, notes, and snippets.

@tbatchelli
Created April 24, 2013 16:23
Show Gist options
  • Save tbatchelli/5453449 to your computer and use it in GitHub Desktop.
Save tbatchelli/5453449 to your computer and use it in GitHub Desktop.
(ns classlojure-test.core
(:use [clojure.java.io :only [as-url]]
[ clojure.pprint :only [pprint]]
[dynapath.util :only [all-classpath-urls classpath-urls]])
(:import [java.net URL URLClassLoader]))
(def base-classloader
(or (.getClassLoader clojure.lang.RT)
(.getContextClassLoader (Thread/currentThread))))
(def ext-classloader
(.getParent ^ClassLoader base-classloader))
(defn url-classloader [urls & [ ext]]
(if ext
(URLClassLoader. (into-array URL (map as-url (flatten urls))) ext)
(URLClassLoader. (into-array URL (map as-url (flatten urls))))))
(defmacro with-classloader [cl & body]
`(binding [*use-context-classloader* true]
(let [cl# (.getContextClassLoader (Thread/currentThread))]
;; (println "Old classlodader=" cl#)
;; import uses a different classloader
(try (.setContextClassLoader (Thread/currentThread) ~cl)
;; (println "Classloader=" (.getContextClassLoader (Thread/currentThread)))
(with-bindings {clojure.lang.Compiler/LOADER ~cl}
~@body)
(finally
(.setContextClassLoader (Thread/currentThread) cl#))))))
(defn get-classpath []
(let [urls (.getURLs (.getContextClassLoader (Thread/currentThread)))]
(doseq [url urls] (print (.toString url)))
urls))
(def vmfest-xpcom
(url-classloader ["file:lib/vboxjxpcom-4.2.4.jar"] base-classloader))
(def vmfest-ws
(url-classloader ["file:lib/vboxjws-4.2.6.jar"] base-classloader))
(defn pprint-all-classpath []
(pprint (dynapath.util/all-classpath-urls)))
;;(get-classpath vmfest-cl)
;; ("/Users/tbatchelli/dev/pallet/classlojure-test/lib/vboxjws-4.2.6.jar")
#_(with-classloader vmfest-xpcom
(import 'org.virtualbox_4_2.IVirtualBox))
#_(eval-in vmfest-cl '(import 'org.virtualbox_4_2.IVirtualBox))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment