【问题标题】:Scala sbt jar allows import when class path is passed on command line, but not in REPL当类路径在命令行上传递时,Scala sbt jar 允许导入,但在 REPL 中则不允许
【发布时间】:2015-08-11 14:09:44
【问题描述】:

我用 Scala 和 SBT 构建了一个小型测试 jar。如果我将 classpath 参数放在 Scala REPL 命令行上,它会完美地导入包。但是,如果我进入 shell 然后添加类路径,它不会识别导入。作为 Scala 的新手,这让我很困惑,所以我希望有人能解释一下。我会尽量提供足够的信息,不过分。

scala -cp configparser_2.10-1.0.jar 
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_75).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import com.oaktreepeak.util._
import com.oaktreepeak.util._

scala> val c = new OakConfig()
c: com.oaktreepeak.util.OakConfig = com.oaktreepeak.util.OakConfig@58d9a418

现在我将在 shell 中等待并将类路径加载到 jar 中:

scala 
Welcome to Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_75).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :cp configparser_2.10-1.0.jar
Added '/home/*****/Dyn/projects/DynECT2/scala/common/ConfigParser/test-configs/configparser_2.10-1.0.jar'.  Your new classpath is:
".:/home/*****/Dyn/projects/DynECT2/scala/common/ConfigParser/test-configs/configparser_2.10-1.0.jar"
Nothing to replay.

scala> import com.oaktreepeak.util._
<console>:7: error: object oaktreepeak is not a member of package com
   import com.oaktreepeak.util._
              ^

scala> 

这是我的 build.sbt 文件:

name := "ConfigParser"

version := "1.0"

scalaVersion := "2.10.4"

organization := "com.oaktreepeak"

以及单个 Scala 源文件:

package com.oaktreepeak.util

import scala.io._
import scala.util.parsing.json._

class OakConfig {
    var iRollupAfter: Int = -1;
    def Load(sPath: String) {
        val config = Source.fromFile(sPath).mkString
        val json:Option[Any] =JSON.parseFull(config)
        val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]]
        iRollupAfter = map.get("RollupAfter").get.asInstanceOf[Double].toInt
    }
}

有人有什么想法或解释吗?

谢谢

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    :cp 在 Scala 2.10 中被破坏,并在 Scala 2.11 中被替换为(工作的):require

    如果您是 Scala 新手,我建议您使用最新、稳定的 Scala 版本,目前是 2.11.6。

    另外,由于您是 Scala 新手,如果您想在 sbt 的 REPL(这是一个很棒的工作流程)中尝试您的项目,只需运行 console,它将编译您的代码并为您提供 REPL包含 Scala 的所有类、您的项目类和所有依赖项的类!无需手动为 REPL 提供类路径。

    【讨论】:

    • 感谢您澄清这是一个错误。我真的以为我做错了什么。我完全满足于在命令行上指定 jar;但我不能让它滑动;-)
    • 不错。 :cp 几乎永远被破坏了。为什么他们既没有修复也没有别名 :cp 而是创建一个新命令?
    • 似乎是因为 ":require 受到更多限制,但更少损坏",并且可能需要重新编写,但运行 ":cp" 的某些信息可能会有所帮助:issues.scala-lang.org/browse/…
    • github.com/scala/scala/pull/4051 上评论命令名称,所以我想这是我的想法。有一个 SO question 询问您将如何实现 require,这就是机制。还值得注意的是,“类路径”本身就是一个有限且破碎的概念。确实,那些 repl 命令来来去去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2018-04-15
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多