Calling Clojure classes in Scala code

278 Views Asked by At

I have a simple clojure code with project.clj having :

  :uberjar-name "piezojob.jar"
  :aot :all
  :main piezo-jobs.core
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [clojurewerkz/quartzite "2.0.0"]]

My core.clj is :

(ns piezo-jobs.core
  (:require [clojurewerkz.quartzite.jobs :refer [defjob]])
  (:gen-class))

(defjob SimpleJob
  [ctx]
  (println "Running a awesome job. piezo-jobs.core."))

(defn -main []
  (println "piezo-jobs.core.-main being called."))

I extracted the .jar in my target folder :

 rm -rf extract && mkdir extract && tar -xvf piezojob.jar -C extract

and it shows :

$ tree target/extract/piezo_jobs/core
target/extract/piezo_jobs/core
└── SimpleJob.class

0 directories, 1 file

In my scala project, i have copied piezojob.jar in lib folder.

In one of scala file, i added :

import piezo_jobs._

sbt compile is happy.

However, if i replace it with : import piezo_jobs.core._ or import piezo_jobs.core.SimpleJob then compiling fails with error :

r.scala:8: object core is not a member of package piezo_jobs
[error] import piezo_jobs.core._
[error]                   ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

Why it is failing ?

FYI, defjob is a macro.

1

There are 1 best solutions below

0
On

The problem is that your code generates both a mynamespace.core class and a mynamespace.core package. Scala doesn't like that, see this bug report. Simply remove the gen-class directive from your ns definition, since all it does is generate piezo-jobs.core.class. Then the import should work.