我希望在我的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了解初学者。
答案 0 :(得分:5)
根据@mjaskowski的评论,Dou you plan to instrument bytecode produced by Scala compiler?,Scala还不是受支持的语言。
简短的回答是:绝对。更长的答案是,但不是很快。 Scala是一种非常(非常,非常,非常,非常)复杂的语言(哦,天哪, 它太复杂了!),测试需要很长时间 具有许多(很多很多)Scala功能的Quasar。鉴于 Scala开发人员数量相对较少,而且整合程度很高 成本,这可能需要一些时间。我们确实支持Clojure(很多 更简单的整合),很快就会(或者我们已经做过) 支持Kotlin(琐碎的整合)。
按照以下步骤查看在sbt中设置javaagent的可能方法。
这是我第一次遇到Quasar,所以这些步骤非常基本,但它们应该让你先行一步。
只有使用以下命令才能在没有任何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 -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
在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
有效!