打包到jar scala应用程序后无效

时间:2011-12-10 22:05:25

标签: scala jar

我有这段代码(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?

1 个答案:

答案 0 :(得分:1)

由于您的用户名为Koziolek,而失败的标识符为pl.koziolekweb.scala.dsi.ResultSet,因此您必须自行负责。

我没有看到ResultSet的导入,所以我猜pl.koziolekweb.scala.dsi也是App和Eval的包。但我没有看到包装声明。

但你用

来称呼它
scala my.pack.App 1+1 

这对我们来说是一种简化吗?但它与错误消息相矛盾,所以它不是简化,而是混乱的来源。