Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clojure dependencies for tests only

Tags:

clojure

In my project.cli I have a dependency on clj-http that is used for tests only, with clj-http.client.

When I look at the uberjar file created for that project, I see that the class fils associated with this dependency are included. That makes the jar file bigger than it need be.

So, is there a way to define a dependency in clojure such that it is only used during tests, and is not included in the uberjar?

I know that I could do this in a pom.xml, but the pom.xml is generated when using clojure, so I only have recourse to something that works in the project.clj file.

To add more colour, my project.clj looks like this

(defproject aproject "0.1.0-SNAPSHOT"
  :description "A project"
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/data.json "0.2.6"]
                 [compojure "1.5.0"]
                 [hiccup "1.0.5"]
                 [http-kit "2.1.18"]
                 [org.clojure/tools.logging "0.3.1"]
                 [ch.qos.logback/logback-classic "1.1.7"]
                 [ring/ring-devel "1.4.0"]]
  :plugins [[lein-ring "0.9.7"]]
  :ring {:handler aproject.core/app-routes}
  :main ^:skip-aot aproject.core
  :target-path "target/%s"
  :resources-paths ["resources/"]
  :profiles {:uberjar {:aot :all}
             :dev     {:dependencies [[peridot "0.4.3"]
                                      [midje "1.8.3"]]
                       :plugins      [[lein-midje "3.2.1"]]
                       :aliases      {"test" ["midje"]}}
              :test     {:dependencies [[clj-http "3.5.0"]
                                   [midje "1.8.3"]]
                    :plugins      [[lein-midje "3.2.1"]]}
         })

I am running the tests like this:

lein with-profile test midje :filters dt

What I am seeing is:

Exception in thread "main" java.io.FileNotFoundException: Could not locate midje/util/ecosystem__init.class or midje/util/ecosystem.clj on classpath., compiling:(/private/var/folders/7l/0fwd_7ls1m19q3_z1_tgg1w80000gn/T/form-init7253661442775183594.clj:1:125)
    at clojure.lang.Compiler.load(Compiler.java:7391)

The filter probably does not affect this, but just in case the test looks like this:

(ns aproject.deployment.core
  (:require [midje.sweet :refer :all]
            [clj-http.client :as client]
            [peridot.core :as p]
            [clojure.data.json :as json]
            [front-end.core :as fe]))

(facts "'aproject' deployed" :dt
       (let [response (client/get "http://localhost:8080/ping")]
         (response :status) => 200
         ))

I can see that the test profile is being triggered, and I seem to have the dependency for midje, and the plugin, but ...?

Thanks

Nathan

like image 473
Nathan Sowatskey Avatar asked Sep 12 '25 09:09

Nathan Sowatskey


1 Answers

Add it to the :test profile, then run your tests with lein with-profile test midje :filters dt. Generate your uberjar as usual, lein uberjar and it shouldn't include the extra files.

like image 114
Alejandro C. Avatar answered Sep 15 '25 04:09

Alejandro C.