0

I have a Clojure project that I'm writing using Intellij and the Cursive and Leiningen plugins.

My problem is, Leiningen isn't checking the central Maven directory when finding dependencies. water-time is my current project, and helpers is the project containing "helper" functions that I want to include.

First, my file structure:

  • IdeaProjects
    • helpers
      • project.clj
      • src
        • helpers
          • general_helpers.clj
    • water-timer
      • project.clj
      • src
        • water_timer
          • tone_producer.clj

helper's project.clj:

(defproject helpers "1"
  :description "General Helper Library"
  :dependencies [[org.clojure/clojure "1.8.0"]])

water-timer's project.clj:

(defproject water-timer "1"
    :description "A timer that reminds you to drink water"
      :dependencies [[org.clojure/clojure "1.8.0"]
                     [helpers "1"]]
      :main water-timer.tone-producer
      :aot [water-timer.tone-producer])

tone_producer.clj with irrelevant bits removed:

(ns tone-producer
  (:require [general-helpers :as g])
  (:gen-class))

(defn -main [& args]
  (println "Test!"))

Both projects were created using lein new. I had originally created them using Intellij, but in my previous question, it was recommended that I create the projects using leiningen, and then import them, so I recreated them from scratch.

If I then cd into helpers and run lein install, it successfully installs helpers into the Maven directory ([my-name]\.m2\repository\helpers\helpers\1\helpers-1.jar).

When I try to use the files though (by trying to create a uberjar using leiningen), it complains that it can't find the dependencies; even if I run lein deps prior:

"C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.2\jre\jre\bin\java" -Dvisualvm.id=91626738132760 -Dfile.encoding=UTF-8 -Dmaven.wagon.http.ssl.easy=false -Dmaven.wagon.rto=10000 -Didea.launcher.port=7541 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.2\bin" -classpath "C:\Users\slomi\.lein\self-installs\leiningen-2.6.1-standalone.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain clojure.main -m leiningen.core.main uberjar
Compiling water-timer.tone-producer
java.io.FileNotFoundException: Could not locate general_helpers__init.class or general_helpers.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name., compiling:(tone_producer.clj:1:1)
Exception in thread "main" java.io.FileNotFoundException: Could not locate general_helpers__init.class or general_helpers.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name., compiling:(tone_producer.clj:1:1)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3657)
    at clojure.lang.Compiler.compile1(Compiler.java:7474)
    at clojure.lang.Compiler.compile1(Compiler.java:7464)
    at clojure.lang.Compiler.compile(Compiler.java:7541)
    at clojure.lang.RT.compile(RT.java:406)
    at clojure.lang.RT.load(RT.java:451)
    at clojure.lang.RT.load(RT.java:419)
    at clojure.core$load$fn__5677.invoke(core.clj:5893)
    at clojure.core$load.invokeStatic(core.clj:5892)
    at clojure.core$load.doInvoke(core.clj:5876)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invokeStatic(core.clj:5697)
    at clojure.core$compile$fn__5682.invoke(core.clj:5903)
    at clojure.core$compile.invokeStatic(core.clj:5903)
    at clojure.core$compile.invoke(core.clj:5895)
    at user$eval20$fn__29.invoke(form-init7018212669773798479.clj:1)
    at user$eval20.invokeStatic(form-init7018212669773798479.clj:1)
    at user$eval20.invoke(form-init7018212669773798479.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6927)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    at clojure.lang.Compiler.loadFile(Compiler.java:7317)
    at clojure.main$load_script.invokeStatic(main.clj:275)
    at clojure.main$init_opt.invokeStatic(main.clj:277)
    at clojure.main$init_opt.invoke(main.clj:277)
    at clojure.main$initialize.invokeStatic(main.clj:308)
    at clojure.main$null_opt.invokeStatic(main.clj:342)
    at clojure.main$null_opt.invoke(main.clj:339)
    at clojure.main$main.invokeStatic(main.clj:421)
    at clojure.main$main.doInvoke(main.clj:384)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.io.FileNotFoundException: Could not locate general_helpers__init.class or general_helpers.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.
    at clojure.lang.RT.load(RT.java:456)
    at clojure.lang.RT.load(RT.java:419)
    at clojure.core$load$fn__5677.invoke(core.clj:5893)
    at clojure.core$load.invokeStatic(core.clj:5892)
    at clojure.core$load.doInvoke(core.clj:5876)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.core$load_one.invokeStatic(core.clj:5697)
    at clojure.core$load_one.invoke(core.clj:5692)
    at clojure.core$load_lib$fn__5626.invoke(core.clj:5737)
    at clojure.core$load_lib.invokeStatic(core.clj:5736)
    at clojure.core$load_lib.doInvoke(core.clj:5717)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invokeStatic(core.clj:648)
    at clojure.core$load_libs.invokeStatic(core.clj:5774)
    at clojure.core$load_libs.doInvoke(core.clj:5758)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:648)
    at clojure.core$require.invokeStatic(core.clj:5796)
    at clojure.core$require.doInvoke(core.clj:5796)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at tone_producer$loading__5569__auto____36.invoke(tone_producer.clj:1)
    at clojure.lang.AFn.applyToHelper(AFn.java:152)
    at clojure.lang.AFn.applyTo(AFn.java:144)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3652)
    ... 35 more
Compilation failed: Subprocess failed

Process finished with exit code 1

The thing that concerns me is the classpath it prints at the top of the error doesn't include the .m2 directory. It is my understanding that leiningen looks in that directory when trying to resolve dependencies, so I'm confused as to why it isn't looking there.

What am I missing here? All I want to do is make a executable jar that depends on a local source!

Community
  • 1
  • 1
Carcigenicate
  • 43,494
  • 9
  • 68
  • 117

1 Answers1

1

Your require in tone_producer.clj should be: [helpers.general-helpers :as g].

In my experience it will be easier to develop your application if you don't try to create libraries right from the outset. Have one Cursive project and have a separate namespace for your intended library. Then you will be able to develop the two parts of your application together.

Chris Murphy
  • 6,411
  • 1
  • 24
  • 42
  • This didn't work, but your suggestion is good. I might do that. Thanks. – Carcigenicate Jul 13 '16 at 01:09
  • Nvm, your suggestion doesn't seem to work either. Leiningen doesn't seem to support the concept of "subprojects", so I would be limited to 1 file per subproject, which is incredibly limiting. – Carcigenicate Jul 13 '16 at 15:00
  • Namespaces are in your code, nothing to do with lein. Lein just needs to know the src directory, that is the root of your namespaces. If you are coming from Java: namespace <=> package. – Chris Murphy Jul 13 '16 at 15:09
  • I know that. A separate namespace for an entire project though isn't sufficient organization. Trying to separate each out into its own subfolder prevents Intellij from finding the source root of any of the projects. My above comment should reference Intellij, not Leiningen – Carcigenicate Jul 13 '16 at 15:14
  • Namespacing of source code is actually a slightly different to the way Java does it. Have you read this http://www.braveclojure.com/organization/? – Chris Murphy Jul 13 '16 at 15:21
  • Your first suggestion actually ended up being correct. It didn't work originally because I neglected to prefix the `general-helpers` namespace with `helpers`. Thanks. – Carcigenicate Jul 13 '16 at 17:08