我有这段代码(scala 2.9.1):
package pl.koziolekweb.scala.dsi
import scala.tools.nsc.interpreter.{ IMain, Results }
trait Eval {
def eval(expresion: String): Option[Any] = {
val interpreter = new IMain {
override protected def parentClassLoader: ClassLoader = App.getClass.getClassLoader
}
val res = new ResultSet
interpreter.beQuietDuring {
interpreter.bind("res", res.getClass.getCanonicalName, res)
interpreter.interpret("res.value = " + expresion)
} match {
case Results.Success => Option(res.value)
case _ => None;
}
}
}
object App extends Eval {
def main(args: Array[String]) {
{ eval(args(0)) } match {
case None => println("nie bangla")
case Some(x) => println(x)
}
}
}
class ResultSet {
var value : Any = null
}
当我编译它(maven)并运行时只需调用:
scala pl.koziolekweb.scala.dsi.App 1+1
程序运行正常(打印2)。但是将所有类文件打包到jar并尝试运行
scala myapp.jar 1+1
我得到了
<console>:5: error: not found: value pl
var value: pl.koziolekweb.scala.dsi.ResultSet = _
^
<console>:6: error: not found: value pl
def set(x: Any) = value = x.asInstanceOf[pl.koziolekweb.scala.dsi.ResultSet]
^
<console>:7: error: not found: value res
res.value = 1+1
^
nie bangla
为什么呢?有什么建议吗?
//编辑:
我找到理由。解释器在类路径中没有myapp.jar
。如何将该罐加载到IMain?
答案 0 :(得分:1)
由于您的用户名为Koziolek
,而失败的标识符为pl.koziolekweb.scala.dsi.ResultSet
,因此您必须自行负责。
我没有看到ResultSet
的导入,所以我猜pl.koziolekweb.scala.dsi也是App和Eval的包。但我没有看到包装声明。
但你用
来称呼它scala my.pack.App 1+1
这对我们来说是一种简化吗?但它与错误消息相矛盾,所以它不是简化,而是混乱的来源。