使用IMain、Akka和sbt实现REPL:让导入工作

4
我正在尝试将交互式shell嵌入到我的Scala应用程序中。我使用以下系统:
  • Scala 2.10.0
  • sbt 0.12.2
  • Akka 2.1.0
  • sbt-lwjgl-plugin 3.1.4
以下是不工作的代码:
    import akka.actor.Actor
    import scala.tools.nsc.Settings
    import scala.tools.nsc.interpreter.IMain

    class TestActor extends Actor {
      def receive => {
        case _ => {
          val settings = new Settings
          settings.usejavacp.value = true
          settings embeddedDefaults ActorSystem.getClass.getClassLoader
          val repl = new IMain(settings)
          repl.interpret("import java._")               // working
          repl.interpret("import scala._")              // working
          repl.interpret("import akka._")               // not working
          repl.interpret("import other.java.class.Bar") // not working
        }
      }
    }

Sbt被设置为fork := true。我尝试了几种设置和类路径配置,但没有找到可行的配置。是否有人可以给我一个提示/解决方案来解决这个问题?


当从sbt运行应用程序时,会出现此问题。我不知道如何解决这个问题,但您可以使用sbt-assembly创建一个自包含的jar文件,并在sbt之外直接运行它,那样就可以解决问题了。 - 0__
如果您需要经常运行而又不想浪费时间重新打包JAR文件,或许可以考虑使用此插件 - 0__
好的,这两种方法都可以正常工作。我更喜欢第一种方法,因为它可以生成与路径和平台无关的结果。需要一些额外的代码来运行lwjgl。谢谢。 - Marco Neumann
1个回答

0

你尝试过使用绝对路径重新导入所有classpath吗?

val settings = new Settings
settings.usejavacp.value = true

val classLoader = Thread.currentThread.getContextClassLoader

classLoader.asInstanceOf[URLClassLoader].getURLs.map(url => new File(url.toURI).getAbsolutePath).foreach {
  jarPath =>
    println(s"adding into Scala SDK classpath : ${jarPath}")

    settings.bootclasspath.append(jarPath)
    settings.classpath.append(jarPath)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接