概述
上一篇介紹了使用SBT管理Scala項目,本文則開始圖文介紹GUI IDE環境下的配置。
Console下管理項目與GUI IDE管理,其實各有各的用途。前者適合做一些自動化的構建,無需人工干預;后者更適合實際的開發,比如Debug,前者沒有后者好用。不過GUI IDE實際也是在調用前者,可以看作是對前者的一種GUI的封裝。做開發應該2個路線都熟悉。
本文使用IntelliJ IDEA Community的版本,本系列中都簡稱為IDEA。
開始
1,安裝IntelliJ IDEA Community,最新的是12.0.x的版本。
2,安裝sbt和scala的plugins。
3,前文已經提到目前還不能直接從已有的scala源代碼文件目錄中導入再創建項目,即通過Import Project的方式,只能直接使用Create New Project的方式來做。
順便提一下,如何刪除IDEA的recent project:只要在welcome界面,鼠標移到一個項目上,然后按鍵盤上的Delete鍵,是的,IDEA沒有設計右鍵菜單來刪除,直接操作鍵盤。
OK,接下去:
創建一個Scala Module,就是Scala項目。注意,那個no /doc/scala-devel-docs/api,不用管;勾選最下面的Enable type-aware highlighting(查閱IDEA scala plugin的博客看解釋)。Finish之后,一個Scala項目就建立好了,但是沒有任何源代碼。
最近的發現是,如果HelloScala目錄已經存在,而且其中含有Scala代碼,那么就可以變相導入了。
另外,如果已經設置了Global Libraries,當再次創建一個項目時,這里的界面會有變化:
上圖紅框中的內容就是設置了Global Libraries后的情況,IntelliJ會自動選擇Global中的設置。下面會提到設置Global的方法。
選擇HelloScala,然后F4,打開Project Structure,
可見2個錯誤,可以直接忽略它們。可以在這里把Project Libraries移到Global LIbraries,這樣所有項目都可以共享:
完成后,如下所示:
OK,退出。看IDEA的右下角:
那個[T],就是用來type-aware highlighting的。上圖是打開狀態。
按快捷鍵Ctrl+Alt+s,打開settings,過濾scala的內容,可以看到scala相關的設置,注意到Compiler->Scala Compiler下的內容為空,因為現在開始使用External Compiler了,在最下面的Scala中有external compiler的配置:
其它的暫時不管。這個External Compiler的作用就是說它是一個獨立的進程,啟動后獨立存在,就算IDEA關閉了,它也可以獨立存在,替代以前的FSC快速編譯。
4,下面,加入Scala源代碼。
在src上右擊,選擇Scala Class:
輸入Class name,並選擇Object,建立一個簡單的Scala object程序。也可以在Name中同時創建包,輸入main.scala.HelloScala,或者scala.HelloScala,自己看下什么效果。
在建立好的object HelloScala中,輸入"mai",然后按下Ctrl+J,出現Live Template,回車確定,就會自動插入代碼 :
最后補上代碼:
也可以用方法補全的方式:輸入"println",然后Ctrl + Alt + Space,彈出方法補全的窗口。
提醒一句,不要順手再輸入一個分號哦,在函數式編程的概念中,是表達式,不是語句。(雖然Scala也可以認分號的,這是因為Scala同時也支持命令式編程)
5,編譯。Ctrl + f9。看下什么是external compiler。
注意status bar上的那個icon,顯示和控制Scala compiler的狀態。同時Event log中顯示在TCP 3200上建立了server。查看下進程:
可以看到有一個Java進程在運行了。
6,Debug。這里需要用SBT。
1)加一個斷點,然后開始debug configuration。
點擊+,選擇Remote,創建一個Remote debug。
命名,然后點擊copy的那個button,把"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"拷貝下來。OK退出。 然后Ctrl+ Alt + s,打開settings, 輸入sbt:
將拷貝的內容貼到SBT的VM parameters中,如上圖選中的部分。OK 退出 。看到debug configuration已經變成剛才增加的那個了。
此時,點擊右側的debug按鈕,哈,肯定會出錯:
這是因為SBT並沒有啟動。注意到那個SBT Console了嗎,點擊它:
它並沒有運行,點擊那個run按鈕,開始運行。初次運行會聯網下載,所以請保持在線:
等待完成后:
會出現SBT的命令提示符">",此時IntelliJ IDEA的sbt插件的初次運行初始化就完成了。這里實際就是開啟了一個SBT的交互式命令控制台,同時經過我們上面的設置,給它開了一個Remtoe debug的端口5005。現在有2個Java的進程在跑,分別代表external compiler server、sbt server。
現在就可以正常debug了:
最下面status bar上的錯誤信息,還是剛才的哦,是event log中最近的一條,不要誤會有問題。
但是,好像斷點還是沒跑到,這是為什么個?!使用過gdb嗎,要run起來!從哪里?進SBT console,run。
Oops,還是出錯了:
崩潰~大腦休克~。冷靜... No main class detected。說明沒有main啊。原來SBT有自己默認的項目文件結構,要在src/main/scala/下創建scala源代碼才可以。
注意到src/main/scala/Hello.Scala中,斷點的圖示有了變化。
這下可以了。下面,就可以調式了。這里簡單f9,讓它跑完。
那么,有沒有辦法改變這個默認的項目結構呢?SBT提供了相關的辦法,這里不再詳述。
7,一個尾巴。注意到初次啟動sbt時,會下載0.12.0-RC4。注意到上一篇介紹SBT的文章中,分析到初次運行時,會獲取0.12.2,那么
1)為什么IDEA中的sbt會下載0.12.0-RC4,而不是0.12.2呢?
2)IDEA的SBT下載的0.1.20-RC4是放在什么地方的呢?
首先,上一篇中的SBT和本文的IDEA中的SBT是不同的(在IDEA的settings中默認使用bundled SBT,而不是單獨下載的sbt版本)。
上一篇中,提到sbt的配置文件,在build.properties中指明了sbt的版本,而在本文中一切使用的都IDEA SBT默認的配置。那么其實在本文的示例中,也可以建立那些SBT配置文件,這樣就不會是0.12.0-RC4了。
上一篇說到這些下載的文件是放到用戶默認路徑下的".sbt"文件中,默認就是C:\Documents and Settings\USER-NAME下。或者說IDEA的配置目錄".IdeaIC12"在哪里,.sbt就在哪里。IDEA SBT獲取的0.12.0-RC4也放在其中:
如上圖所示。在我的電腦中,已經Windows用戶路徑修改到了e:\leo.cao下,所以".sbt"放在那里。(BTW,怎么修改的?只要修改我的文檔的默認路徑即可)
總結
1,在IDEA中只能創建Scala項目,無法從源代碼中導入而創建。
2,要使用Remote Debug的方式調試Scala程序,同時要配置IDEA SBT plugin的VM parameters。
3,IDEA 12 Scala Plugin開始使用External Compiler的方式。啟動后,注意有一個獨立的Java進程在跑。
4,在開始Debug前,需要先啟動sbt。初次啟動,需要聯網。這樣也會有一個獨立的Java進程在跑。
5,項目的文件結構,要按照SBT的默認結構來創建,否則需要自己定義SBT的配置文件才能運行。
6,實際Debug時,還要通過SBT Console,通過把程序run起來,來觸發斷點。
7,本文所示項目的源代碼:gitcafe: https://gitcafe.com/leo.l.cao/HelloScala;bitbucket: https://bitbucket.org/leolcao/helloscala。
下一篇,終於開始說明Scala on Android開發的構建。
返回索引


![clipboard[1] clipboard[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyMC00YjEwZDhmNmFlNzk0NWRjOTcxM2Q5ZTdjYjRjOTIxNi5wbmc=.png)
![clipboard[2] clipboard[2]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyMS1jMTBiMmE4YjczYzE0MjA0YjA2MDdiMWRiMmVhZGJmYy5wbmc=.png)
![clipboard[3] clipboard[3]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyMy1lMDljNDgyYzYxM2M0ZTViOWE2ZWM0ZmU1YmJmYjE2OS5wbmc=.png)
![clipboard[4] clipboard[4]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyNi1mNDE1ZTk4MzM0YTY0ZGY5YTc0ZDQ4MTViNzg2YzY1MS5wbmc=.png)
![clipboard[5] clipboard[5]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyOC1hYTVkMTY4YWJjYjY0ZGQ0YTAwNTY2M2M5MzkyYjhkOC5wbmc=.png)
![clipboard[6] clipboard[6]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEyOS0wOTFiNjk3NDU0NWE0NjhhOTVjNTM5Mjk5NWRmOGMyZS5wbmc=.png)
![clipboard[7] clipboard[7]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEzMi0yYzY5MWUxOGM0ODE0YWZiYWJlNGM4NTMyNDY5NTNkYi5wbmc=.png)
![clipboard[8] clipboard[8]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEzMy1mNWQ4YTliYjY1YjQ0ZTA5YTQyMWE3ZTk0MjE4MDBkYy5wbmc=.png)
![clipboard[9] clipboard[9]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEzNS0zZGUxNTJjNWU1ZWQ0MmU3YmE1MGEzYjRkYjgyYWZkNi5wbmc=.png)
![clipboard[10] clipboard[10]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEzNy04ODE4ZjNkOGEzNTc0MzM0ODA1NTZmMDdiZTVlZWRkMy5wbmc=.png)
![clipboard[11] clipboard[11]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTEzOS0yNGQxY2Q2Y2MxZjE0NGQ3YjU0ZjY0ODAwYjQ2ZTFkOS5wbmc=.png)
![clipboard[12] clipboard[12]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0MC0yMDMxYWVkYzhkOWU0YTk4YmZhMjNjMTQ2YThhNjI3Yy5wbmc=.png)
![clipboard[13] clipboard[13]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0Mi04YWNhNGNiMjY1ZjE0NWJhYTk3YmYwNzRjZjFiNWQ3OC5wbmc=.png)
![clipboard[14] clipboard[14]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0NC1mYTk1NjY1ZmI0OGI0NWZjOTI0Njg4NjJkYmYwZTgyNC5wbmc=.png)
![clipboard[15] clipboard[15]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0NS01MTcyOTdiYzdiYTY0MDU3YjQ2NTRkZDNkNTVhZWFlMy5wbmc=.png)
![clipboard[16] clipboard[16]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0Ni0yY2U3OTAyYWUzOWU0N2ViOTAyMThhZTMwOTlkMzVjNC5wbmc=.png)
![clipboard[17] clipboard[17]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE0OC05MDYwNWE0NmUxYzA0NTgxODg5NDhmYzNiNDA2ZmQyNi5wbmc=.png)
![clipboard[18] clipboard[18]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1MC05MTVjZDNkMTdjYTg0NTE2OWI3MzhlNzkxYTM0MWY2NS5wbmc=.png)
![clipboard[19] clipboard[19]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1Mi0zZjBhZmUxZWNhMWI0NWE1Yjc4OTFiNTJhZmQwMTk0YS5wbmc=.png)
![clipboard[20] clipboard[20]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1NC1mMWU0ODZkMDZkZjk0NTE3OTk3Njg2OTZhNWYzMTc5OS5wbmc=.png)
![clipboard[21] clipboard[21]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1Ni1kY2YyNmM1MjIwMzI0YTE1OTkzN2ZiNWYyZmVkYWE0YS5wbmc=.png)
![clipboard[22] clipboard[22]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1Ny1hYTZiZmJiOWEzYzg0YjA3ODg2ZjIzNmY0NjEzNmU4Ny5wbmc=.png)
![clipboard[23] clipboard[23]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTE1OS0yOWYyZGY5MjdiOTA0YmY0YWQ5MThiZDkwZWMxOGJkYi5wbmc=.png)
![clipboard[24] clipboard[24]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIwMS1mNjM4MTNlZjY5NzU0NTNiOWMyNzBjNGM2NGZlNDA5OC5wbmc=.png)
![clipboard[25] clipboard[25]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIwMi03YjUwMmNjYWE0Y2Y0ODg3YjI5NmU1MmQyMmU5OWJmNi5wbmc=.png)
![clipboard[26] clipboard[26]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIwNC04NmM1NTllNWRlMzk0NWNlYTU5NjA0OTA2NmFlNmEzOC5wbmc=.png)
![clipboard[27] clipboard[27]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIwNS0yZWFiNDJkMjYyNmI0YjRlYTMzNTRiZTdjZGJkMzIyNi5wbmc=.png)
![clipboard[28] clipboard[28]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTQwNC0xODQ4YTMxMmJmYmE0YTllYmUyN2MwNjBiODMwODk5OC5wbmc=.png)
![clipboard[29] clipboard[29]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIwOC1jYmNlNzM5MzRkOWQ0YWY0YmUxNjljNzU1MWY1ZDI1Ny5wbmc=.png)
![clipboard[30] clipboard[30]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIxMC04Y2ZlN2I0M2M0NGI0N2ZjOTMzMGRlMDM2NGVjOWZkMS5wbmc=.png)
![clipboard[31] clipboard[31]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIxNS1jZDI3Zjg4ZjU3ZmY0NzAwOTIwNTMzNTk4MTk5NDdhOS5wbmc=.png)
![clipboard[32] clipboard[32]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIxNi03YjE0OWUzNWJmOTQ0NTY0OTk4NzI0MjQwMDRhMzExMC5wbmc=.png)
![clipboard[33] clipboard[33]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIxNy02ZDFlOGUwMWVlZWQ0YzZiYmEwMmYxZGM5MWFkMGM3MC5wbmc=.png)
![clipboard[34] clipboard[34]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIxOS1iMWFlYzhjZTZkY2E0NWY3YWU5Yzk1MjhiZTdlOTAyOC5wbmc=.png)
![clipboard[35] clipboard[35]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIyMC04YjBjYWMzOGFkOWY0Mzg4ODhlYmNlZDc3OThlOWI1My5wbmc=.png)
![clipboard[36] clipboard[36]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIyMi01NTA1NmYxZGExODc0YjY4OGFhOTZjN2ViZDVkOThlYi5wbmc=.png)
![clipboard[37] clipboard[37]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIyMy1kZTJmYTE0YzEyODc0MWVmOGVjMGY2ZmE3ODY5NjUwMS5wbmc=.png)
![clipboard[38] clipboard[38]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIyNS0xNWJhODdlZWQzN2M0ZTQwYTU2MGZjZWYxZDU5YzJhNy5wbmc=.png)
![clipboard[39] clipboard[39]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3MDY3LzIwMTMwMy8wODA5MTIyNi0yNjM3NjQ2MzA4NWM0ZDA3YjFiN2YzMWYyNWU3MmEyNC5wbmc=.png)