Istvan
Istvan

Reputation: 8562

How to add directory to Clojure's classpath?

I have installed the libraries with Maven to the ~/.m2/repository/ directory. I would like to add that path to the default Clojure classpath. I could not find the documentation how to do that.

Any hints?

Cheers!

clj
Clojure 1.4.0
user=> (require '[clojure.java.jmx :as jmx])
FileNotFoundException Could not locate clojure/java/jmx__init.class or clojure/java/jmx.clj on classpath:   clojure.lang.RT.load (RT.java:432)

The class path by default is:

user=> (println (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))
(#<URL file:/Users/myuser/cljmx/> #<URL file:/usr/local/Cellar/clojure/1.4.0/clojure-1.4.0.jar> #<URL file:/Users/myuser/cljmx/>)
nil

Upvotes: 12

Views: 21137

Answers (5)

acorello
acorello

Reputation: 4653

Another option is to create a deps.edn file in the folder where you plan to run the REPL or where you keep your project files.

This file is used to inform Clojure about dependencies, source files, execution profiles, etc… It's loaded when you run a REPL (but there are other use cases) and it's supported by the core of Clojure and it's officially documented on https://clojure.org/reference/deps_and_cli

In your case you may just want to put something like the following, to declare what dependencies you want to download and put on the Java classpath.

{
   :deps {
      the.dependency/you-want {:mvn/version "1.0.0"}
   }
}

In deps.edn you can specify:

  • third party dependencies (eg JARs) that can be already saved locally, or hosted on a Maven repository, or on Git repository…
  • source paths, where your source code resides, if any

Note that the dependencies will be downloaded and cached in .cpcache/ folder, beside the deps.edn itself. I'm not sure if you can instruct it to use the global ~/.m2 instead.

You may find the dependency coordinates (name and latest version) on clojars.org

deps.edn is "lighter", part of the core Clojure, if less powerful than leiningen; so maybe suited for setting up an environment for casual/exploratory coding at the REPL or CLI.

You can also have a global deps.edn in ~/.clojure/deps.edn where you may want to define common configurations, dependencies, etc. to be used across different projects. Specific configurations can be invoked/overridden using options on the command line.

Upvotes: 1

bmillare
bmillare

Reputation: 4233

It should be noted that you also have the option of adding classpaths at runtime with the library pomegranate https://github.com/cemerick/pomegranate

This lets you do like:

 (require '[cemerick.pomegranate :as pom])
 (pom/add-classpath "/home/user/~.m2/....")

Upvotes: 10

Arthur Ulfeldt
Arthur Ulfeldt

Reputation: 91534

Leiningen really makes this process a lot less painful by keeping the setting of the classpath associated with the project, and more importantly leads to a repeatable build process. where you can come back to the project years later and still get a repl. A general outline of using leiningen in these cases:

  • lein new projectname
  • add the library you need to your project.clj file with a name you choose
  • run lein deps to print out the command to use to add the jar to your local repo
  • add the jar
  • run lein deps again (you can skip this step if using leiningen2)
  • run lein repl
  • enjoy

this is assuming that the library you are using is not already part of or available from a package in a maven repo, which many are.

Upvotes: 12

Joost Diepenmaat
Joost Diepenmaat

Reputation: 17773

The non-painful, popular method is to not mess with maven and classpaths and the JRE directly and use leiningen: https://github.com/technomancy/leiningen/

Otherwise, you can modify whatever is in clj and add/set the classpath in whatever ways java likes. See for example Setting multiple jars in java classpath

Upvotes: 10

ffriend
ffriend

Reputation: 28492

I assume that clj is a script to start Clojure REPL. Take a look into this script and find line similar to this:

java -cp /path/to/clojure.jar clojure.main

Here you start class clojure.main having "clojure.jar" on your classpath. To add more jars just add them to the end of -cp option values. E.g. on Linux:

java -cp /path/to/clojure.jar:/path/to/mylib.jar clojure.main

(use ; instead of : on Windows)

However, very soon you'll get tired of this way and will look for project management tool. So it makes sense to start using it right now. Take a look at Leiningen - it manages dependencies for you based on Maven (so it will be extremely easy to add new jar) and has REPL.

Upvotes: 7

Related Questions