Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically load dependencies in Clojure REPL

Is it possible to download and install previously unspecified Maven dependencies in a running Clojure REPL?

I'm thinking of the fairly common case where you want to quickly pull in a dependency temporarily for some testing or visualisation tools, but don't want to close down your current REPL session.

For example if you wanted to pull in Incanter to draw some pretty charts of data in your current REPL session, you might use something like the following:

(load-dependency "incanter" "incanter" "1.3.0-SNAPSHOT")

;; now do stuff with Incanter......

Presumably you would have to trigger the dependency resoltion / loading in Maven or Leiningen from an appropriate repository but I don't know enough about their internals to know whether this is possible or not at runtime.....

like image 920
mikera Avatar asked Oct 10 '11 10:10

mikera


2 Answers

Java's default classloader behavior makes this difficult, but pomegrenade (actually, pomegranate) claims to be able to do what you want.

like image 99
Joost Diepenmaat Avatar answered Oct 26 '22 02:10

Joost Diepenmaat


Alembic is a leiningen plugin that adds this functionality to the repl.

Direct quote from the README:

Alembic is a clojure library that allows you to distill jars onto your classpath in a running JVM instance. You can use it to add dependencies to a running REPL, either in an ad-hoc fashion, or by reloading your project.clj file.

It also adds a (load-project) function that parses the project.clj and adds missing dependencies on the fly.

like image 34
clows Avatar answered Oct 26 '22 04:10

clows