2016-02-23 8 views
2

У меня есть простой код Clojure с project.clj имеющий:Вызывающие классы Clojure в Scala коде

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

Мой core.clj является:

(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.")) 

Я извлек .jar в моей target папке:

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

и он показывает:

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

0 directories, 1 file 

В моем проекте scala я скопировал piezojob.jar в папку lib.

В одном из файла лестницу, я добавил:

import piezo_jobs._

sbt compile счастлив.

Однако, если я заменить его: import piezo_jobs.core._ или import piezo_jobs.core.SimpleJob затем компиляции с ошибкой:

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 

Почему это не удается?

FYI, defjob - макро.

+0

Какую версию Scala вы используете? –

ответ

0

Проблема заключается в том, что ваш код генерирует как класс mynamespace.core, так и пакет mynamespace.core. Scala не нравится, see this bug report. Просто удалите директиву gen-class из вашего определения ns, поскольку все, что он делает, генерирует piezo-jobs.core.class. Затем импорт должен работать.