今天在Scala开发环境的选择上纠结了比较久,尝试了Scala IDE,IntelliJ IDEA,也尝试了maven + scala-maven-plugin,最终选择投靠sbt,并且选择Sublime作为编辑器,加上sublime-ensime这个插件。
Scala IDE & IntelliJ IDEA
Scala IDE和Eclipse长得差不多,亲切度较高,且加上Maven for Scala插件之后,可以直接创建Scala的maven项目。我下载来的3.0+版本的scala IDE可以直接创建scala maven项目,并且会生成如下项目结构。但是Scala IDE不具备代码提示功能,高亮的字段不是很全面,且maven相比sbt还是逊色一些。还有一个问题是ScalaIDE不是很完善,有一些小问题。我使用它来看Spark项目的源码,并不选择其作为开发环境。
IntelliJ IDEA的话可能是很多Scala开发者的首选。对我来说,不太熟悉IntelliJ IDEA,刚起步的话还是考虑能快速熟悉和起步,IntelliJ IDEA好像也是支持sbt的。以后我可能会转战到IntelliJ IDEA的平台。
Sublime + sbt + Ensime
sublime还算是一个比较简单又实用的编辑器,很多人会拿它来写脚本语言,适合Win和Mac环境。
sbt的话就不用说了,应该是比maven强大些,而且既然写scala的话,理应尽量去投靠sbt。它有一点比maven方便的地方,就是在sbt console里面,敲 ~complie之后,可以即时编译,如果你有两个屏幕的话,可以在另一块屏幕上看到刚刚敲入并保存的代码编译有没有问题。sbt入门的话可以参看github上的一份文档。sbt的依赖和管理更简洁,又同maven有相同之处,所以也很好上手。
Ensime是github上的一个项目,为Sublime Text 2(Sublime Text 3无法使用,因为两个内置python版本不同,ensime有些python文件需要执行)做的插件,是Sublime下的外部package,我使用之后提炼出它的几点功能(即为Sublime补充的一些内容):
- 自己写的类可以通过 ctrl + 鼠标点击 跳转
- 没有引入或依赖的包,类,会提示报错
- ctrl+alt+b 可以build整个工程,相当于sbt下面敲compile也会build工程一样
- alt + i 可以给指定的类显示可以选择导入的目标包,并自动添加import
[ { "keys": ["f9"], "command": "ensime_toggle_breakpoint" }, { "keys": ["ctrl+shift+f9"], "command": "ensime_clear_breakpoints" }, { "keys": ["ctrl+f5"], "command": "ensime_startup" }, { "keys": ["ctrl+shift+f5"], "command": "ensime_shutdown" }, { "keys": ["f5"], "command": "ensime_smart_run_debugger" }, { "keys": ["shift+f5"], "command": "ensime_stop_debugger" }, { "keys": ["f11"], "command": "ensime_step_into" }, { "keys": ["f10"], "command": "ensime_step_over" }, { "keys": ["alt+i"], "command": "ensime_add_import" }, { "keys": ["ctrl+shift+b"], "command": "ensime_build" } ]更多Ensime的安装,用法和介绍可以 参考github主页,安装和使用很简单。
sbt spark0.8 依赖的一个问题
仅仅在build.sbt下增加
libraryDependencies ++= Seq( "org.apache.spark" % "spark-core_2.9.3" % "0.8.0-incubating" )然后build的话,会出错,提示
unresolved dependency: com.typesafe.akka#akka-actor;2.0.5: not found不仅仅是akka-actor,事实上akka-xx的2.0.5都会not found。奇怪的是我在maven环境下,pom.xml里同样是
<dependency> <!-- Spark dependency --> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.9.3</artifactId> <version>0.8.0-incubating</version> </dependency>是可以成功导入spark-0.8所有需要的依赖的。因此,我的解决方法是让sbt去使用maven的本地仓库,使用一次后sbt自己的本地仓库里就有akka的相关2.0.5的包了,下面给出我的完整build.sbt内容,
name := "hi-scala" organization := "com.baidu.smartq" version := "0.0.1-SNAPSHOT" scalaVersion := "2.9.3" resolvers ++= Seq( "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/", "Local Maven Repo" at "C://Users/zhangbaofeng/.m2/repository" ) libraryDependencies ++= Seq( "org.mongodb" %% "casbah" % "2.6.3", "org.slf4j" % "slf4j-api" % "1.6.4", "org.slf4j" % "slf4j-simple" % "1.6.4", "org.apache.spark" % "spark-core_2.9.3" % "0.8.0-incubating" ) ivyXML := <dependency org="org.eclipse.jetty.orbit" name="javax.servlet" rev="2.5.0.v201103041518"> <artifact name="javax.servlet" type="orbit" ext="jar"/> </dependency>最后的ivyXML部分也是为了一个包而增加上去的,它的报错是下面这个包引起的
org.eclipse.jetty.orbit#javax.servlet;2.5.0.v201103041518!javax.servlet.orbit添加近ivyXML这段之后就okay了。该问题参考 spark-use mailing list里的一个问题。
总结
本文介绍了我的Scala开发环境选型,简单对比了取舍的原因。然后针对sbt下spark-0.8包部分包无法加载问题给出了解决方案,并帖出了完整可用的build.sbt内容。希望可以给同样是起步学习Scala的同学一些帮助。
(全文完)