scala - 从Scala sbt任务中调用Clojure代码

标签 scala clojure sbt clojure-java-interop

我正在尝试将一些clojure代码称为sbt任务。

我的build.sbt看起来像,

lazy val aTask = taskKey[Unit]("a task")

libraryDependencies ++= Seq(
"org.clojure" % "clojure" % "1.9.0"
)

import clojure.java.api.Clojure
import clojure.lang.IFn

aTask := {
val plus: IFn = Clojure.`var`("clojure.core", "+")
println(plus.invoke(1, 4))
}

项目/build.sbt的内容
resolvers += Resolver.mavenLocal

libraryDependencies ++= Seq(
   "org.clojure" % "clojure" % "1.9.0"
 )

另外,我在我的项目的project/build.sbt中添加了clojure dep。

调用任务时出现以下错误
[error] java.lang.ExceptionInInitializerError
[error] at clojure.lang.Namespace.<init>(Namespace.java:34)
[error] at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
[error] at clojure.lang.Var.intern(Var.java:148)
[error] at clojure.java.api.Clojure.var(Clojure.java:82)
[error] at clojure.java.api.Clojure.<clinit>(Clojure.java:96)
[error] at $2d5a9b65ddee7e6a09cc$.$anonfun$$sbtdef$1(build.sbt:20)
[error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] at sbt.std.Transform$$anon$3.$anonfun$apply$2(System.scala:46)
[error] at sbt.std.Transform$$anon$4.work(System.scala:66)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:262)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] at sbt.Execute.work(Execute.scala:271)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:262)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:174)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:36)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] Caused by: java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath.
[error] at clojure.lang.RT.load(RT.java:463)
[error] at clojure.lang.RT.load(RT.java:426)
[error] at clojure.lang.RT.doInit(RT.java:468)
[error] at clojure.lang.RT.<clinit>(RT.java:336)

我可以尝试的任何指示都将有所帮助。

最佳答案

我认为sbt的类加载器设置存在问题。 Clojure's RT class loads Clojure namespaces/classes using class loaders API。如果sbt以RT的类加载器无法通过其使用的类加载器找到Clojure的类的方式配置类加载器的层次结构和类加载策略(例如,首先使用父级),则它将失败并显示错误消息。

不幸的是,我不知道sbt内部来确定如何配置类加载器。也许另一个问题对调查有帮助:How to display classpath used for run task?

关于scala - 从Scala sbt任务中调用Clojure代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49124696/

相关文章:

clojure - 在 Clojure 中创建 Uberjar 的问题

java - SBT:添加第三方库依赖但 NoClassDefFoundError

scala - 如何使用 VS Code 和 Metals 运行现有的 Scala 项目?

json - Play Framework - 向 JSON 对象添加字段

algorithm - 学习编程技巧的优先顺序及其他建议

scala - 将多个 WS 调用合并为一个结果时处理错误

用不同数量的参数重载的函数

scala - 运行 sbt 测试时忽略 log4j.properties

clojure - 协议(protocol)是否有可能将新状态引入现有类?

playframework-2.0 - Play 2.0 : How to add SBT build number to page footer