Windows下Scala编程环境的构建:使用IntelliJ IDEA Community
概述
上一篇介绍了使用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]](http://images0.cnblogs.com/blog/107067/201303/08091120-4b10d8f6ae7945dc9713d9e7cb4c9216.png)
![clipboard[2] clipboard[2]](http://images0.cnblogs.com/blog/107067/201303/08091121-c10b2a8b73c14204b0607b1db2eadbfc.png)
![clipboard[3] clipboard[3]](http://images0.cnblogs.com/blog/107067/201303/08091123-e09c482c613c4e5b9a6ec4fe5bbfb169.png)
![clipboard[4] clipboard[4]](http://images0.cnblogs.com/blog/107067/201303/08091126-f415e98334a64df9a74d4815b786c651.png)
![clipboard[5] clipboard[5]](http://images0.cnblogs.com/blog/107067/201303/08091128-aa5d168abcb64dd4a005663c9392b8d8.png)
![clipboard[6] clipboard[6]](http://images0.cnblogs.com/blog/107067/201303/08091129-091b6974545a468a95c5392995df8c2e.png)
![clipboard[7] clipboard[7]](http://images0.cnblogs.com/blog/107067/201303/08091132-2c691e18c4814afbabe4c853246953db.png)
![clipboard[8] clipboard[8]](http://images0.cnblogs.com/blog/107067/201303/08091133-f5d8a9bb65b44e09a421a7e9421800dc.png)
![clipboard[9] clipboard[9]](http://images0.cnblogs.com/blog/107067/201303/08091135-3de152c5e5ed42e7ba50a3b4db82afd6.png)
![clipboard[10] clipboard[10]](http://images0.cnblogs.com/blog/107067/201303/08091137-8818f3d8a357433480556f07be5eedd3.png)
![clipboard[11] clipboard[11]](http://images0.cnblogs.com/blog/107067/201303/08091139-24d1cd6cc1f144d7b54f64800b46e1d9.png)
![clipboard[12] clipboard[12]](http://images0.cnblogs.com/blog/107067/201303/08091140-2031aedc8d9e4a98bfa23c146a8a627c.png)
![clipboard[13] clipboard[13]](http://images0.cnblogs.com/blog/107067/201303/08091142-8aca4cb265f145baa97bf074cf1b5d78.png)
![clipboard[14] clipboard[14]](http://images0.cnblogs.com/blog/107067/201303/08091144-fa95665fb48b45fc92468862dbf0e824.png)
![clipboard[15] clipboard[15]](http://images0.cnblogs.com/blog/107067/201303/08091145-517297bc7ba64057b4654dd3d55aeae3.png)
![clipboard[16] clipboard[16]](http://images0.cnblogs.com/blog/107067/201303/08091146-2ce7902ae39e47eb90218ae3099d35c4.png)
![clipboard[17] clipboard[17]](http://images0.cnblogs.com/blog/107067/201303/08091148-90605a46e1c0458188948fc3b406fd26.png)
![clipboard[18] clipboard[18]](http://images0.cnblogs.com/blog/107067/201303/08091150-915cd3d17ca845169b738e791a341f65.png)
![clipboard[19] clipboard[19]](http://images0.cnblogs.com/blog/107067/201303/08091152-3f0afe1eca1b45a5b7891b52afd0194a.png)
![clipboard[20] clipboard[20]](http://images0.cnblogs.com/blog/107067/201303/08091154-f1e486d06df9451799768696a5f31799.png)
![clipboard[21] clipboard[21]](http://images0.cnblogs.com/blog/107067/201303/08091156-dcf26c5220324a159937fb5f2fedaa4a.png)
![clipboard[22] clipboard[22]](http://images0.cnblogs.com/blog/107067/201303/08091157-aa6bfbb9a3c84b07886f236f46136e87.png)
![clipboard[23] clipboard[23]](http://images0.cnblogs.com/blog/107067/201303/08091159-29f2df927b904bf4ad918bd90ec18bdb.png)
![clipboard[24] clipboard[24]](http://images0.cnblogs.com/blog/107067/201303/08091201-f63813ef6975453b9c270c4c64fe4098.png)
![clipboard[25] clipboard[25]](http://images0.cnblogs.com/blog/107067/201303/08091202-7b502ccaa4cf4887b296e52d22e99bf6.png)
![clipboard[26] clipboard[26]](http://images0.cnblogs.com/blog/107067/201303/08091204-86c559e5de3945cea596049066ae6a38.png)
![clipboard[27] clipboard[27]](http://images0.cnblogs.com/blog/107067/201303/08091205-2eab42d2626b4b4ea3354be7cdbd3226.png)
![clipboard[28] clipboard[28]](http://images0.cnblogs.com/blog/107067/201303/08091404-1848a312bfba4a9ebe27c060b8308998.png)
![clipboard[29] clipboard[29]](http://images0.cnblogs.com/blog/107067/201303/08091208-cbce73934d9d4af4be169c7551f5d257.png)
![clipboard[30] clipboard[30]](http://images0.cnblogs.com/blog/107067/201303/08091210-8cfe7b43c44b47fc9330de0364ec9fd1.png)
![clipboard[31] clipboard[31]](http://images0.cnblogs.com/blog/107067/201303/08091215-cd27f88f57ff470092053359819947a9.png)
![clipboard[32] clipboard[32]](http://images0.cnblogs.com/blog/107067/201303/08091216-7b149e35bf94456499872424004a3110.png)
![clipboard[33] clipboard[33]](http://images0.cnblogs.com/blog/107067/201303/08091217-6d1e8e01eeed4c6bba02f1dc91ad0c70.png)
![clipboard[34] clipboard[34]](http://images0.cnblogs.com/blog/107067/201303/08091219-b1aec8ce6dca45f7ae9c9528be7e9028.png)
![clipboard[35] clipboard[35]](http://images0.cnblogs.com/blog/107067/201303/08091220-8b0cac38ad9f438888ebced7798e9b53.png)
![clipboard[36] clipboard[36]](http://images0.cnblogs.com/blog/107067/201303/08091222-55056f1da1874b688aa96c7ebd5d98eb.png)
![clipboard[37] clipboard[37]](http://images0.cnblogs.com/blog/107067/201303/08091223-de2fa14c128741ef8ec0f6fa78696501.png)
![clipboard[38] clipboard[38]](http://images0.cnblogs.com/blog/107067/201303/08091225-15ba87eed37c4e40a560fcef1d59c2a7.png)
![clipboard[39] clipboard[39]](http://images0.cnblogs.com/blog/107067/201303/08091226-26376463085c4d07b1b7f31f25e72a24.png)
浙公网安备 33010602011771号