Getting started with Datomic and Clojure in Emacs

3.6k views Asked by At

My project.clj file looks like this

(defproject cljs-template "0.1.0-SNAPSHOT"
  :description "FIXME: write this!"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.4.0-beta4"]
                 [noir-cljs "0.3.0"]
                 [fetch "0.1.0-alpha2"]
                 [noir "1.3.0-beta2"]
                 [org.clojure/core.cache "0.5.0"]
                 [com.datomic/datomic "0.1.3142"
                  :exclusions [org.slf4j/slf4j-nop org.slf4j/slf4j-log4j12]]
                 [ch.qos.logback/logback-classic "1.0.1"]]
  :plugins [[lein-swank "1.4.3"]]
  ;:cljsbuild {:builds [{}]}
  :main ^{:skip-aot true} cljs-template.server)

and my /src/cljs_template/server.clj begins as the following:

(ns cljs-template.server
  (:require [noir.server :as server]
            [noir.cljs.core :as cljs]
            [cljs-template.tree :as tree])
  (:use [datomic.api :only [db q] :as d]))

I then start up swank, run (in-ns 'cljs-template.server) within it, move my cursor to the end of the (ns) function call, and attempt to run the (ns) method using Ctrl-x Ctrl-e. When I do so, I get the following error.

No message.
  [Thrown class java.lang.ExceptionInInitializerError]

Restarts:
 0: [QUIT] Quit to the SLIME top level
 1: [CAUSE1] Invoke debugger on cause  org.apache.lucene.index.IndexWriterConfig [Thrown class java.lang.ClassNotFoundException]

Backtrace:
  0:    (Unknown Source) java.lang.Class.forName0
  1:      Class.java:247 java.lang.Class.forName
  2:        RT.java:2030 clojure.lang.RT.loadClassForName
  3:         RT.java:417 clojure.lang.RT.load
  4:         RT.java:398 clojure.lang.RT.load
  5:       core.clj:5386 clojure.core/load[fn]
  6:       core.clj:5385 clojure.core/load
  7:     RestFn.java:408 clojure.lang.RestFn.invoke
  8:       core.clj:5200 clojure.core/load-one
  9:       core.clj:5237 clojure.core/load-lib
 10:     RestFn.java:142 clojure.lang.RestFn.applyTo
 11:        core.clj:602 clojure.core/apply
 12:       core.clj:5271 clojure.core/load-libs
 13:     RestFn.java:137 clojure.lang.RestFn.applyTo
 14:        core.clj:602 clojure.core/apply
 15:       core.clj:5352 clojure.core/require
 16:     RestFn.java:436 clojure.lang.RestFn.invoke
 17: fulltext_index.clj:4 datomic.fulltext-index/loading
 18:    (Unknown Source) datomic.fulltext_index__init.load
 19:    (Unknown Source) datomic.fulltext_index__init.<clinit>
 20:    (Unknown Source) java.lang.Class.forName0
 21:      Class.java:247 java.lang.Class.forName
 22:        RT.java:2030 clojure.lang.RT.loadClassForName
 23:         RT.java:417 clojure.lang.RT.load
 24:         RT.java:398 clojure.lang.RT.load
 25:       core.clj:5386 clojure.core/load[fn]
 26:       core.clj:5385 clojure.core/load
 27:     RestFn.java:408 clojure.lang.RestFn.invoke
 28:       core.clj:5200 clojure.core/load-one
 29:       core.clj:5237 clojure.core/load-lib
 30:     RestFn.java:142 clojure.lang.RestFn.applyTo
 31:        core.clj:602 clojure.core/apply
 32:       core.clj:5271 clojure.core/load-libs
 33:     RestFn.java:137 clojure.lang.RestFn.applyTo
 34:        core.clj:602 clojure.core/apply
 35:       core.clj:5352 clojure.core/require
 36:     RestFn.java:703 clojure.lang.RestFn.invoke
 37:            db.clj:4 datomic.db/loading
 38:    (Unknown Source) datomic.db__init.load
 39:    (Unknown Source) datomic.db__init.<clinit>
 40:    (Unknown Source) java.lang.Class.forName0
 41:      Class.java:247 java.lang.Class.forName
 42:        RT.java:2030 clojure.lang.RT.loadClassForName
 43:         RT.java:417 clojure.lang.RT.load
 44:         RT.java:398 clojure.lang.RT.load
 45:       core.clj:5386 clojure.core/load[fn]
 46:       core.clj:5385 clojure.core/load
 47:     RestFn.java:408 clojure.lang.RestFn.invoke
 48:       core.clj:5200 clojure.core/load-one
 49:       core.clj:5237 clojure.core/load-lib
 50:     RestFn.java:142 clojure.lang.RestFn.applyTo
 51:        core.clj:602 clojure.core/apply
 52:       core.clj:5271 clojure.core/load-libs
 53:     RestFn.java:137 clojure.lang.RestFn.applyTo
 54:        core.clj:602 clojure.core/apply
 55:       core.clj:5352 clojure.core/require
 56:     RestFn.java:703 clojure.lang.RestFn.invoke
 57:         query.clj:4 datomic.query/loading
 58:    (Unknown Source) datomic.query__init.load
 59:    (Unknown Source) datomic.query__init.<clinit>
 60:    (Unknown Source) java.lang.Class.forName0
 61:      Class.java:247 java.lang.Class.forName
 62:        RT.java:2030 clojure.lang.RT.loadClassForName
 63:         RT.java:417 clojure.lang.RT.load
 64:         RT.java:398 clojure.lang.RT.load
 65:       core.clj:5386 clojure.core/load[fn]
 66:       core.clj:5385 clojure.core/load
 67:     RestFn.java:408 clojure.lang.RestFn.invoke
 68:       core.clj:5200 clojure.core/load-one
 69:       core.clj:5237 clojure.core/load-lib
 70:     RestFn.java:142 clojure.lang.RestFn.applyTo
 71:        core.clj:602 clojure.core/apply
 72:       core.clj:5271 clojure.core/load-libs
 73:     RestFn.java:137 clojure.lang.RestFn.applyTo
 74:        core.clj:602 clojure.core/apply
 75:       core.clj:5352 clojure.core/require
 76:     RestFn.java:421 clojure.lang.RestFn.invoke
 77:           api.clj:6 datomic.api/loading
 78:    (Unknown Source) datomic.api__init.load
 79:    (Unknown Source) datomic.api__init.<clinit>
 80:    (Unknown Source) java.lang.Class.forName0
 81:      Class.java:247 java.lang.Class.forName
 82:        RT.java:2030 clojure.lang.RT.loadClassForName
 83:         RT.java:417 clojure.lang.RT.load
 84:         RT.java:398 clojure.lang.RT.load
 85:       core.clj:5386 clojure.core/load[fn]
 86:       core.clj:5385 clojure.core/load
 87:     RestFn.java:408 clojure.lang.RestFn.invoke
 88:       core.clj:5200 clojure.core/load-one
 89:       core.clj:5237 clojure.core/load-lib
 90:     RestFn.java:142 clojure.lang.RestFn.applyTo
 91:        core.clj:602 clojure.core/apply
 92:       core.clj:5271 clojure.core/load-libs
 93:     RestFn.java:137 clojure.lang.RestFn.applyTo
 94:        core.clj:604 clojure.core/apply
 95:       core.clj:5363 clojure.core/use
 96:     RestFn.java:408 clojure.lang.RestFn.invoke
 97:    NO_SOURCE_FILE:1 cljs-template.server/eval1941[fn]
 98:    NO_SOURCE_FILE:1 cljs-template.server/eval1941
 99:  Compiler.java:6465 clojure.lang.Compiler.eval
 100:  Compiler.java:6455 clojure.lang.Compiler.eval
 101:  Compiler.java:6431 clojure.lang.Compiler.eval
 102:       core.clj:2795 clojure.core/eval
 103:        core.clj:532 swank.core/eval782[fn]
 104:    MultiFn.java:163 clojure.lang.MultiFn.invoke
 105:        basic.clj:54 swank.commands.basic/eval-region
 106:        basic.clj:44 swank.commands.basic/eval-region
 107:        basic.clj:73 swank.commands.basic/eval968[fn]
 108:        Var.java:401 clojure.lang.Var.invoke
 109:    (Unknown Source) user/eval1937
 110:  Compiler.java:6465 clojure.lang.Compiler.eval
 111:  Compiler.java:6431 clojure.lang.Compiler.eval
 112:       core.clj:2795 clojure.core/eval
 113:        core.clj:100 swank.core/eval-in-emacs-package
 114:        core.clj:256 swank.core/eval-for-emacs
 115:        Var.java:409 clojure.lang.Var.invoke
 116:        AFn.java:167 clojure.lang.AFn.applyToHelper
 117:        Var.java:518 clojure.lang.Var.applyTo
 118:        core.clj:600 clojure.core/apply
 119:        core.clj:107 swank.core/eval-from-control
 120:        core.clj:330 swank.core/spawn-worker-thread[fn]
 121:        AFn.java:159 clojure.lang.AFn.applyToHelper
 122:        AFn.java:151 clojure.lang.AFn.applyTo
 123:        core.clj:600 clojure.core/apply
 124:        core.clj:326 swank.core/spawn-worker-thread[fn]
 125:     RestFn.java:397 clojure.lang.RestFn.invoke
 126:         AFn.java:24 clojure.lang.AFn.run
 127:     Thread.java:662 java.lang.Thread.run

I then press 0 to close the stacktrace, and press Ctrl-x Ctrl-e on the (ns) call again, now my error is:

Could not initialize class datomic.api__init
  [Thrown class java.lang.NoClassDefFoundError]

Restarts:
 0: [QUIT] Quit to the SLIME top level

Backtrace:
  0:    (Unknown Source) java.lang.Class.forName0
  1:      Class.java:247 java.lang.Class.forName
  2:        RT.java:2030 clojure.lang.RT.loadClassForName
  3:         RT.java:417 clojure.lang.RT.load
  4:         RT.java:398 clojure.lang.RT.load
  5:       core.clj:5386 clojure.core/load[fn]
  6:       core.clj:5385 clojure.core/load
  7:     RestFn.java:408 clojure.lang.RestFn.invoke
  8:       core.clj:5200 clojure.core/load-one
  9:       core.clj:5237 clojure.core/load-lib
 10:     RestFn.java:142 clojure.lang.RestFn.applyTo
 11:        core.clj:602 clojure.core/apply
 12:       core.clj:5271 clojure.core/load-libs
 13:     RestFn.java:137 clojure.lang.RestFn.applyTo
 14:        core.clj:604 clojure.core/apply
 15:       core.clj:5363 clojure.core/use
 16:     RestFn.java:408 clojure.lang.RestFn.invoke
 17:    NO_SOURCE_FILE:1 cljs-template.server/eval6292[fn]
 18:    NO_SOURCE_FILE:1 cljs-template.server/eval6292
 19:  Compiler.java:6465 clojure.lang.Compiler.eval
 20:  Compiler.java:6455 clojure.lang.Compiler.eval
 21:  Compiler.java:6431 clojure.lang.Compiler.eval
 22:       core.clj:2795 clojure.core/eval
 23:        core.clj:532 swank.core/eval782[fn]
 24:    MultiFn.java:163 clojure.lang.MultiFn.invoke
 25:        basic.clj:54 swank.commands.basic/eval-region
 26:        basic.clj:44 swank.commands.basic/eval-region
 27:        basic.clj:73 swank.commands.basic/eval968[fn]
 28:        Var.java:401 clojure.lang.Var.invoke
 29:    (Unknown Source) cljs-template.server/eval6288
 30:  Compiler.java:6465 clojure.lang.Compiler.eval
 31:  Compiler.java:6431 clojure.lang.Compiler.eval
 32:       core.clj:2795 clojure.core/eval
 33:        core.clj:100 swank.core/eval-in-emacs-package
 34:        core.clj:256 swank.core/eval-for-emacs
 35:        Var.java:409 clojure.lang.Var.invoke
 36:        AFn.java:167 clojure.lang.AFn.applyToHelper
 37:        Var.java:518 clojure.lang.Var.applyTo
 38:        core.clj:600 clojure.core/apply
 39:        core.clj:107 swank.core/eval-from-control
 40:        core.clj:330 swank.core/spawn-worker-thread[fn]
 41:        AFn.java:159 clojure.lang.AFn.applyToHelper
 42:        AFn.java:151 clojure.lang.AFn.applyTo
 43:        core.clj:600 clojure.core/apply
 44:        core.clj:326 swank.core/spawn-worker-thread[fn]
 45:     RestFn.java:397 clojure.lang.RestFn.invoke
 46:         AFn.java:24 clojure.lang.AFn.run
 47:     Thread.java:662 java.lang.Thread.run

What am I doing wrong? How do I get datomic working in my emacs using swank/slime.

2

There are 2 answers

0
Stephen Cagle On BEST ANSWER

Turns out I was executing the wrong command.

I was running lein deps and getting the following error.

...
Try downloading the file manually from the project website.

  Then, install it using the command: 
      mvn install:install-file -DgroupId=com.datomic -DartifactId=datomic -Dversion=0.1.3157 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there: 
      mvn deploy:deploy-file -DgroupId=com.datomic -DartifactId=datomic -Dversion=0.1.3157 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency: 
    1) org.apache.maven:super-pom:pom:2.0
    2) com.datomic:datomic:jar:0.1.3157

I saw that the README file in the downloaded datomic code also contained mention of adding datomic to my mvn. Naturally (here comes the stupid part) I assumed that they sort of said the same thing.

lein will tell you that you should execute

mvn install:install-file -DgroupId=com.datomic -DartifactId=datomic -Dversion=0.1.3157 -Dpackaging=jar -Dfile=/path/to/file

the README says you should execute

mvn install:install-file -DgroupId=com.datomic -DartifactId=datomic -Dfile=datomic-${DATOMIC-VERSION}.jar -DpomFile=pom.xml

Did you notice that the README instructions also includes a pom.xml file? Neither did I! Yeah, that is important.

Anyway, be sure to also include the pom.xml file. If you were trying to add datomic 0.1.3157 to your mvn repository, you would execute the following in the datomic directory you downloaded.

mvn install:install-file -DgroupId=com.datomic -DartifactId=datomic -Dfile=datomic-0.1.3157.jar -DpomFile=pom.xml
3
Arthur Ulfeldt On

I posted a working project here

my usual suspect in debugging swank problems are:

  • is leiningen up to date
  • the version of lein-swank
  • version of emacs (Emacs 24, I have found to be much more reliable)
  • leftover old dependencies in the lib dir

EDIT: the correct way to get the datomic jar is as Stephen Cagle says, copied from his comment below:

 mvn install:install-file -DgroupId=com.datomic -DartifactId=datomic -Dfile=datomic-${DATOMIC-VERSION}.jar