当在命令行上传递 class 路径时,Scala sbt jar 允许导入,但在 REPL 中则不允许
Scala sbt jar allows import when class path is passed on command line, but not in REPL
我用 Scala 和 SBT 构建了一个小型测试 jar。如果我将类路径参数放在 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
}
}
有人有任何想法或解释吗?
谢谢
:cp
在 Scala 2.10 中被破坏,并在 Scala 2.11 中被(有效的):require
取代。
如果您是 Scala 新手,我建议您使用最新的稳定版 Scala,目前为 2.11.6。
此外,由于您是 Scala 的新手,如果您想在来自 sbt 的 REPL(这是一个很棒的工作流程)中尝试您的项目,只需 运行 console
,这将编译您的代码并为您提供包含所有 Scala 类、您的项目 类 和所有依赖项的 类 的 REPL!无需手动为 REPL 提供类路径。
我用 Scala 和 SBT 构建了一个小型测试 jar。如果我将类路径参数放在 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:
中等待并将类路径加载到 jarscala
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
}
}
有人有任何想法或解释吗?
谢谢
:cp
在 Scala 2.10 中被破坏,并在 Scala 2.11 中被(有效的):require
取代。
如果您是 Scala 新手,我建议您使用最新的稳定版 Scala,目前为 2.11.6。
此外,由于您是 Scala 的新手,如果您想在来自 sbt 的 REPL(这是一个很棒的工作流程)中尝试您的项目,只需 运行 console
,这将编译您的代码并为您提供包含所有 Scala 类、您的项目 类 和所有依赖项的 类 的 REPL!无需手动为 REPL 提供类路径。