scala导入微风可在sbt控制台中运行,但不能从脚本运行

时间:2018-09-24 19:10:05

标签: scala import sbt

我正在关注这本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"
)

这是我尝试使用CLASSPATH方法后的屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:2)

问题

问题是,当您从SBT运行控制台时,您位于项目 space 中,该项目包括您的库。
但是,当您单独执行脚本时,它位于系统 space 中,并且不存在库。

如何修复

这里的选项对:

  • 创建一个 Uber JAR ,而不是一个脚本。
  • 将这些库添加到您的 CLASSPATH
  • 使用炸药

Uber JAR

通常,最常见的解决方法是创建一个Uber JAR。它也是最可移植的,因为现在您有了一个包含所有依赖项的jar,因此您可以在任何地方运行它-而且,由于它是Jar,您甚至不需要Scala,只需一个 JRE
如果您采用这种方式,请检查sbt-assembly。但是,由于您的脚本可能很小,因此采用这种方法可能会过分解决您的问题-但请记住,对于大型项目,这是规范的解决方案。

CLASSPATH

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中设置相同的路径,然后执行脚本。