我希望在我的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)
另请参阅此存储库以获取启动器.
根据@mjaskowski的评论,你打算设计Scala编译器生成的字节码吗?,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/cache/co.paralleluniverse/quasar-core/jars/quasar-core-0.5.0.jar -help
它似乎不是自足的,需要额外的罐子CLASSPATH.
以下命令使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
在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)
有用!