概述
上一篇介紹了使用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開發的構建。
返回索引