scala - 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"
)
解决方案
问题
问题是当您从 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 脚本。所以可能值得一试。
推荐阅读
- python - discord.py :: 我将如何发出命令将单词添加到过滤器?
- sql - 如何将 R 向量粘贴到 sql 查询?
- python - 解析破折号连接多个值的字段
- visual-studio - Visual Studio 的 PowerShell 工具,但收到数字签名无效时间戳错误
- bash - 针对来自终端的参数列表执行 shell 脚本
- c++ - 从 c++ windows 应用程序排列监视器
- callback - 来自按钮 n_clicks 的回调卡片颜色
- c# - Entity Framework Core,如何为 .HasOptional 配置可空外键等效项
- c# - C#soap 调用正在生成 HEAD 请求并且外部服务器正在阻塞。如何去除这些?
- node.js - 如何在不需要刷新页面的情况下与区块链交互