Lyn Headley
Lyn Headley

Reputation: 11588

How to launch a clojure repl with access to a jar

I'm new to clojure. I have a jar file I want to play with in a clojure repl, but I've failed to do so with leiningen 2.

I have tried placing the jar file in src/myjar.jar and also in src/org/mydomain/myjar.jar

When I run lein repl I get errors stating that leiningen can not find my artifact, and a reference to a page about repeatability which I do not understand.

Here is my project.clj (with the real name of myjar)

(defproject cljliveordead "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [org.allen.temporalintervalrelationships/time "0.2" :extension "jar"]])

Upvotes: 8

Views: 3289

Answers (3)

octopusgrabbus
octopusgrabbus

Reputation: 10695

I use clojure-csv in a lot of my applications, so make sure the modules referencing clojure-csv were able to build with it, this is what I did:

0) Ran lein new bene-csv

1) Added this to project.clj (after enter lein new bene-csv). The pertinent line is [clojure-csv/clojure-csv "1.3.2"], but it makes sense to show you the whole project.clj for good example's sake.

(defproject bene-csv "1.0.4-SNAPSHOT"
  :description "A csv parsing library"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [clojure-csv/clojure-csv "1.3.2"]
                 [util "1.0.2-SNAPSHOT"]]


  :aot [bene-csv.core]
  :omit-source true)

2) Made sure my bene-csv/src/bene_csv/core.clj references clojure-csv.

(ns bene-csv.core
  ^{:author "Charles M. Norton",
    :doc "bene-csv is a small library to parse a .csv file.
        Created on March 8, 2012"}
  (:require [clojure.string :as cstr])
  (:require [util.core :as utl])
  (:use clojure-csv.core))

Finally, I ran these commands, so that my main project could reference bene-csv's functions and defs.

lein deps
lein install

Upvotes: 1

Jeff Johnston
Jeff Johnston

Reputation: 2246

You can use local jars using the lein-localrepo plugin. Add this line to your project.clj

:plugins [[lein-localrepo "0.4.0"]]

Then install the jar to the local repository using

lein localrepo install <path-to-jar> org.allen.temporalintervalrelationships/time 0.2

You can check that the file is installed by running lein localrepo list and check that lein can resolve the project dependencies using lein deps. If all is well then you can start playing with the jar using lein repl.

Leiningen doesn't like local jars due to its goal of repeatable builds. If this was a real project using a third party closed source jar then the best thing to do is install it in a local Nexus repository and add a reference to that repository to your project.

However, this all seems a bit heavyweight for what you are trying to achieve. If all you want to do is play with the jar in the REPL then create a simple project like this

(defproject clojure-time "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [com.cemerick/pomegranate "0.0.13"]])

and use the pomegranate library to add the jar to your classpath manually

(require '[cemerick.pomegranate :as p])
(p/add-classpath "jsr-310-ri-0.6.3.jar")
(javax.time.Instant/now)

and play away.

Upvotes: 4

Arthur Ulfeldt
Arthur Ulfeldt

Reputation: 91554

the hackish way is to just put it into /proiject/path/lib/ and the 'proper' way is to:

  • add a dependency for it to your project
  • run lein deps which will print the command for installing the jar to your local maven repo
  • run the command leiningen gives you with the path to your jar
  • run lein deps again

Upvotes: 1

Related Questions