正如我们在Java项目中会使用Maven或Gradle作为构建工具一样,在Scala中,最为流行的构建非SBT莫属。在Mac下安装SBT其实很容易,你可以用Macports或者homebrew来安装,只需要敲一条命令即可。
|
或者:
|
要在IntelliJ Idea下要使用SBT似乎也很简单,因为你可以直接在Idea中下载安装sbt的插件。这一点都不费功夫。但我现在希望sbt对依赖的管理,要能很好地集成到Idea中。就像gradle一样,我只需要在build.gradle脚本中添加:apply plugin: ‘idea’,就可以在命令行中运行gradle idea,然后就能更新IntelliJ中项目的依赖了。例如,我要在IntelliJ中的Scala项目中使用ScalaTest来写单元测试。为了获得该ScalaTest Repository,就可以在build.sbt中添加:
|
注意,在sbt文件中一定要有一条空行哦,不然就会报错。现在,转到项目主目录下,运行sbt的命令,就能自动下载scalatest的包了。可惜这样还不够,因为即使下载了scalatest,IntelliJ仍然拒绝认识它,然后很恼人地给出红色错误提示。例如在test目录下写一个scalatest的单元测试:
|
它根本就不认识JUnit和ScalaTest,所以类似Suite,@RunWith之类的东西皆为红色,看着让人闹心。当然,我在这里还用了JUnit,所以还需要在build.sbt中添加JUnit的依赖。
要想能够在IntelliJ Idea中更新项目,就像Gradle一样,也需要专门为idea服务的插件,sbt中即为sbt-idea。方法是在mac的用户主目录下,找到.sbt/plugins目录,然后看看有没有build.sbt文件。如果没有,就创建一个。事实上,要是连.sbt/plugins目录也没有找到,没关系,同样可以自己创建。接下来,在build.sbt文件中写入:
|
添加了这个插件后,就可以回到自己项目的目录下,运行sbt gen-idea,就可以更新IntelliJ Idea中的项目了。再看看Idea中的代码,之前那些恼人的红色应该就会消失了。
在使用ScalaTest时,还碰到一个小问题。我在搜寻scalatest的repository时(在Maven Repository),直接打开了第一个搜索结果,最新的版本是1.4 RC2。它的sbt repository为:libraryDependencies += “org.scalatest” % “scalatest” % “1.4.RC2”
结果就悲剧了,跑测试怎么样也跑不过,抛出的异常为:java.lang.ClassCastException: scala.collection.immutable.Set$EmptySet$ cannot be cast to scala.collection.generic.Addable
最初,我没有想到是scala与scalatest版本不匹配的问题,还以为自己的单元测试语法不对。几经搜寻,在搜到的这个帖子(http://www.scala-lang.org/node/11466)上看到版本不兼容问题,我才如大梦初醒般,想着去查询各自的版本。我使用的scala为最新版本2.9.2,而scalatest的1.4 RC2依赖的是scala 2.8.0版本。而就在这篇帖子中,则提到scala是向前兼容,却不支持向后兼容。我在Maven Repository中又做了一次搜索,结果发现scalatest的第二条搜索结果,才是我需要的,它的最新版本是2.0 M4,最新稳定版本则为1.8,都依赖于Scala 2.9.1。这就是说,与我使用的scala仅有最小版本的区别。在build.sbt中更改为该版本的repository(即前面给出的内容),测试就可以通过了。