【问题标题】:Calling Clojure classes in Scala code在 Scala 代码中调用 Clojure 类
【发布时间】:2016-06-05 07:58:08
【问题描述】:

我有一个简单的 clojure 代码,project.clj 有:

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

我在target 文件夹中提取了.jar

 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 文件夹中。

在一个 scala 文件中,我添加了:

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

为什么会失败?

仅供参考,defjob 是一个宏。

【问题讨论】:

  • 你使用的是什么版本的 Scala?

标签: scala clojure jvm-languages


【解决方案1】:

问题在于您的代码同时生成了mynamespace.core 类和mynamespace.core 包。 Scala 不喜欢这样,see this bug report。只需从 ns 定义中删除 gen-class 指令,因为它所做的只是生成 piezo-jobs.core.class。然后导入应该可以工作了。

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 2011-04-03
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多