首页 > 解决方案 > scala import 微风在 sbt 控制台中工作,但不适用于脚本

问题描述

我正在关注这本scala for data science book 并且 git 从它的 repo中克隆了所有示例代码。当我第一次sbt console输入import breeze.lianlg._命令时,它工作正常。但是,如果我运行以 line 开头的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 方法后的屏幕截图: 在此处输入图像描述

标签: scalaimportsbt

解决方案


问题

问题是当您从 SBT 运行控制台时,您位于项目空间内,其中包括您的库。
但是当您自己执行脚本时,它在系统空间中,并且库不存在。

怎么修

这里有几个选项:

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

优步 JAR

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

类路径

CLASSPATH env 变量指示 Java在哪里搜索类(通常包含在库 - Jars 中),因此您只需更新此变量以包含缺少的库,您可以通过创建文件夹来执行此操作(例如 /opt/jars/)并将所有 jar 下载到该文件夹​​,然后在文件中添加这样的一行.bashrc,以确保每次打开 shell 时都会更新 env var。

export CLASSPATH="/opt/jars/*:$CLASSPATH"

PS:由于 SBT 已经将 jar 下载到该.ivy2/cache/文件夹​​,您可以将CLASSPATH指向该目录,但要注意同一个 Jar 的多个版本。

菊石

Ammonite就像一个拥有超能力的 Scala RELP,它的主要优点之一是从 ivy 导入 Jars,这正是你所需要的。Ammonite也可用于scala 脚本。所以可能值得一试。


推荐阅读