如何在sbt下使用Scala与Scala?

mja*_*ski 7 scala sbt quasar

我希望在我的SBT项目中使用Quasar.由于尚未支持Scala,唯一可行的选择是让SBT编译一些使用Quasar的java类.

我尝试过

javaOptions += "-javaagent:PATH_TO_JAR/quasar-core-0.5.0.jar"
Run Code Online (Sandbox Code Playgroud)

fork := true
Run Code Online (Sandbox Code Playgroud)

当我读到使用例如JRebel时,必须将这两个语句插入到build.sbt中

但它似乎无法使用Quasarish类(QuasarExample)产生:

[error]    IllegalArgumentException: : Fiber class HelloWorldSpec$$anonfun$1$$anonfun$apply$3$$anon$1 has not been instrumented.  (Fiber.java:151)
[error] co.paralleluniverse.fibers.Fiber.<init>(Fiber.java:151)
[error] co.paralleluniverse.fibers.Fiber.<init>(Fiber.java:171)
[error] co.paralleluniverse.fibers.Fiber.<init>(Fiber.java:448)
Run Code Online (Sandbox Code Playgroud)

成功检测后预计会运行且没有错误的一段代码:

new Fiber<Integer>() {
    @Override
    protected Integer run() throws SuspendExecution, InterruptedException {
        return 0;
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

另请参阅此存储库以获取启动器.

Jac*_*ski 5

根据@mjaskowski的评论,你打算设计Scala编译器生成的字节码吗?,Scala还不是受支持的语言.

简短的回答是:绝对.更长的答案是,但不是很快.Scala是一种非常(非常,非常,非常,非常)非常复杂的语言(哦,天哪,它非常复杂!),并且需要很长时间才能使用许多(很多很多)Scala功能来测试Quasar.鉴于Scala开发人员数量相对较少,以及高昂的集成成本,这可能需要一些时间.然而,我们支持Clojure(更简单的集成),很快就可能(或者我们已经做过)支持Kotlin(简单集成).

请继续查看在sbt中设置javaagent的可能方法.

这是我第一次遇到Quasar所以步骤非常基本,但是它们应该让你先行一步.

仅在JVM中运行Quasar的javaagent

只有使用以下命令才能在没有任何Scala/sbt的jar的情况下运行Quasar的javaagent.

java -cp /Users/jacek/.ivy2/cache/org.ow2.asm/asm-util/jars/asm-util-5.0.1.jar:/Users/jacek/.ivy2/cache/org.ow2.asm /asm-commons/jars/asm-commons-5.0.1.jar:/Users/jacek/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.1.jar -javaagent:/ Users/jacek/.ivy2/cache/co.paralleluniverse/quasar-core/jars/quasar-core-0.5.0.jar -help

它似乎不是自足的,需要额外的罐子CLASSPATH.

用scala运行Quasar的javaagent

以下命令使scalaQuasar的javaagent感到高兴.

scala -debug -usebootcp -toolcp /Users/jacek/.ivy2/cache/org.ow2.asm/asm-tree/jars/asm-tree-5.0.1.jar:/Users/jacek/.ivy2/cache/org .ow2.asm/ASM-util的/罐/ ASM-util的-5.0.1.jar:/Users/jacek/.ivy2/cache/org.ow2.asm/asm-commons/jars/asm-commons-5.0.1的.jar:/Users/jacek/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.1.jar:/Users/jacek/.ivy2/cache/org.ow2.asm/asm-analysis /jars/asm-analysis-5.0.1.jar -J-javaagent:/Users/jacek/.ivy2/cache/co.paralleluniverse/quasar-core/jars/quasar-core-0.5.0.jar

最初尝试使用sbt运行Quasar

在Quasar中添加必要的依赖项build.sbt:

val quasarDeps = Seq(
  "quasar-core",
  "quasar-actors",
  "quasar-galaxy"
)

libraryDependencies := quasarDeps.map("co.paralleluniverse" % _ % "0.5.0")
Run Code Online (Sandbox Code Playgroud)

它归结为libraryDependencies必要的罐子增加.我选择了所有可用的.

我在Scala console中检查了这些库是否可用.

?  quasar-sbt  xsbt
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Set current project to quasar-sbt (in build file:/Users/jacek/sandbox/quasar-sbt/)
> console
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_60).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import co.paralleluniverse.fibers._
import co.paralleluniverse.fibers._

scala> Fiber.DEFAULT_STACK_SIZE
res0: Int = 32
Run Code Online (Sandbox Code Playgroud)

您还必须添加java代理.将以下内容添加到build.sbt:

// FIXME the path to quasar-core should be simpler
javaOptions in Test += "-javaagent:/Users/jacek/.ivy2/cache/co.paralleluniverse/quasar-core/jars/quasar-core-0.5.0.jar"

fork in Test := true

// only needed for Specs2 so I could test the test setup
libraryDependencies += "org.specs2" %% "specs2" % "2.3.13" % Test

scalacOptions in Test ++= Seq("-Yrangepos")
Run Code Online (Sandbox Code Playgroud)

reload 构建发生了变化.

> reload
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Set current project to quasar-sbt (in build file:/Users/jacek/sandbox/quasar-sbt/)
Run Code Online (Sandbox Code Playgroud)

编写测试以确保所有设置正确.我使用了HelloWorldSpecfrom [Specs2][2]进行了一些更改:

import org.specs2.mutable._

import co.paralleluniverse.fibers._

class HelloWorldSpec extends Specification {

  "Quasar" should {
    "Fiber.DEFAULT_STACK_SIZE defaults to 32" in {
      Fiber.DEFAULT_STACK_SIZE === 32
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个非常广泛的测试,所以根据您的需要调整它.保存文件src/test/scala.

执行test.

> test
objc[27427]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
[info] HelloWorldSpec
[info]
[info] Quasar should
[info] + Fiber.DEFAULT_STACK_SIZE defaults to 32
[info]
[info] Total for specification HelloWorldSpec
[info] Finished in 40 ms
[info] 1 example, 0 failure, 0 error
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 4 s, completed Jul 13, 2014 2:04:13 PM
Run Code Online (Sandbox Code Playgroud)

有用!