263
魔獸
Scala開發環境選型: Sublime + sbt + Ensime
今天在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 "https://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的同學一些幫助。
(全文完)
最後更新:2017-04-03 14:54:23