我正在关注这本scala for data science书,并且git从its repo克隆了所有示例代码。当我第一次执行sbt console
并输入import breeze.lianlg._
命令时,它可以正常工作。但是,如果我运行了以import breeze.linalg._
行开头的脚本,该脚本将无法运行,并且错误消息表明导入不成功。如何解决此问题并使脚本运行?谢谢!
编辑:这是build.sbt文件的外观:
name := "S4DS"
organization := "s4ds"
version := "0.1.0-SNAPSHOT"
scalaVersion := "2.11.7"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze" % "0.11.2",
"org.scalanlp" %% "breeze-natives" % "0.11.2",
"org.slf4j" % "slf4j-simple" % "1.7.5"
)
答案 0 :(得分:2)
问题是,当您从SBT运行控制台时,您位于项目 space 中,该项目包括您的库。
但是,当您单独执行脚本时,它位于系统 space 中,并且不存在库。
这里的选项对:
通常,最常见的解决方法是创建一个Uber JAR。它也是最可移植的,因为现在您有了一个包含所有依赖项的jar,因此您可以在任何地方运行它-而且,由于它是Jar,您甚至不需要Scala,只需一个 JRE 。
如果您采用这种方式,请检查sbt-assembly。但是,由于您的脚本可能很小,因此采用这种方法可能会过分解决您的问题-但请记住,对于大型项目,这是规范的解决方案。
CLASSPATH的env变量指示Java在哪里搜索类(通常包含在库-Jars中),因此您只需更新此变量以包括缺少的库,就可以为此,请创建一个文件夹(例如/ opt / jars /),然后将所有jar文件下载到该文件夹,然后在.bashrc
文件中添加一行这样的代码,以确保每次打开外壳程序时,env var都会更新。
export CLASSPATH="/opt/jars/*:$CLASSPATH"
PS::由于SBT已将罐子下载到.ivy2/cache/
文件夹中,因此您可以将 CLASSPATH 指向该目录,但要注意多个版本同一罐子。
Ammonite就像具有超级功能的Scala RELP,它的主要优点之一就是import Jars from ivy,这正是您所需要的。 Ammonite 也可以用于scala scripts。因此,值得尝试一下。
答案 1 :(得分:0)
在sbt控制台中时,库是从缓存中获取的,但是在运行脚本时,它将仅检查默认库的设置。请在.ivy缓存中搜索jar。复制路径并在classpath中设置相同的路径,然后执行脚本。