如何在sbt下使用Scala与Scala?

时间:2014-07-13 11:36:07

标签: scala sbt quasar

我希望在我的SBT项目中使用Quasar。由于Scala is not yet supported唯一可行的选择是让SBT编译一些使用Quasar的java类。

我尝试了

javaOptions += "-javaagent:PATH_TO_JAR/quasar-core-0.5.0.jar"

fork := true

当我读到使用例如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)

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

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

另请参阅this repository了解初学者。

1 个答案:

答案 0 :(得分:5)

根据@mjaskowski的评论,Dou you plan to instrument bytecode produced by Scala compiler?,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 /缓存/ co.paralleluniverse /类星体核心/瓶/类星体核心-0.5.0.jar   -help

它似乎不是自包含的,需要CLASSPATH上的其他广告。

使用scala

运行Quasar的javaagent

以下命令使scala和Quasar的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:/用户/亚切克/.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的初始尝试

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

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

libraryDependencies := quasarDeps.map("co.paralleluniverse" % _ % "0.5.0")

归结为用必要的罐子增加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

您还必须添加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")

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/)

编写测试以确保所有设置正确。我使用HelloWorldSpec中的[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
    }
  }
}

这不是一个非常广泛的测试,所以根据您的需要进行调整。将文件保存在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

有效!