2015/6/15

如何建置 scala, play framework 的開發環境

傳統的 Java Web Project 也就是 Java EE (Enterprise Environment) ,其中包含了 JSP/Servlet以及 EJB,後來在肥大的 EJB 失敗後,網頁專案開始 POJO (Plain Old Java Object) 化,就是盡可能地不做太多的物件封裝,這個階段,產生了很多的網頁 MVC framework,而 play framework 是以 scala 與 java 撰寫的 web application framework,他的本質也是提供一種 MVC 的框架,但實質上,他還承襲了 scala 非同步的特性,提高了網頁服務的可用性,他也更進一步地完全跳脫了 Java EE 的網頁標準,我們要做的不再是 JSP 以及 Servlet。

構建可伸縮系統 Scala vs Java 這篇文章,以 Java/Tomcat 與 Scala/Play 這兩種 web framework,建立了簡單的購物 web project,並以 JMeter 進行效能的量測,從該文章的結論中我們得知,當系統在穩定運作的過程中,兩個 framework 的效能表現並沒有什麼差異,而當預先定義的 search 後端服務發生問題時,尤其是使用 proxy 連接到 seach service 時,網站的其他功能例如 Payment、瀏覽目錄的網頁也同時受到影響。但是用 Scala 建置的 service 可在 search 發生問題時,不影響到其他的服務項目。原因是因為 Scala 天生的非同步特性,讓 Programmer 能很自然地寫出非同步 IO 處理的程式碼,如果要使用 Java 達到同樣的功能,也能夠做到,但是我們會發現很多不自然的 callback 程式碼,programmer 需要耗費大量心力,去維護非同步的程式碼。

play framework wiki 中,提到了一些使用 Play framework 的 reference sides,例如比較有名氣的 Linkedin、Coursera。

要建置 play framework 的開發環境,需要安裝下列的工具

  1. JDK 8
    到 Oracle 下載 JDK並安裝,安裝後設定環境變數
     JAVA_HOME=C:\java\jdk1.8.0_45
     PATH=%JAVA_HOME%\bin;%PATH%
    
  2. scala 2.11.6
    下載 scala-2.11.6.msi 並安裝,安裝後設定環境變數
     PATH=C:\java\scala\bin;%PATH%
    
  3. sbt 0.13.8
    下載 sbt-0.13.8.msi 並安裝,安裝後設定環境變數
     SBT_HOME=C:\java\sbt
     PATH=%SBT_HOME%\bin;%PATH%
    
  4. Eclipse Luna + WTP

  5. Scala IDE 4 + Play Support in Scala IDE
    在 Eclipse 的 Help -> Install New Software 增加一個網址 Scala IDE - http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site ,然後就能安裝 Scala IDE 與 Play Support。

  6. Play Framework Activator
    typesafe-activator-1.3.2-minimal.zip

     PLAY_HOME=C:\java\activator-1.3.2-minimal
     PATH=%PLAY_HOME%\bin;%PATH%
    

要建立一個 scala play project 可以遵循以下的步驟

  1. 啟動「命令提示字元」切換到 eclipse workspace 的資料夾,鍵入指令 activator new
    因為運作環境是使用類似 maven 的 ivy2,第一次執行會等很久,等到 script 把 jar 都存到 C:\Users{user.home}.ivy2\cache 的目錄中。
    第二次執行 activator new 之後,就不需要再等待下載 jar 了,在 script 裡面選擇 6,就會建立 play-scala project template,然後輸入 play-scala 作為 project folder 的名稱。
    ```
    D:\projectcase\trunk3>activator new

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
1) minimal-akka-java-seed
2) minimal-akka-scala-seed
3) minimal-java
4) minimal-scala
5) play-java
6) play-scala
(hit tab to see a list of all templates)

6
Enter a name for your application (just press enter for 'play-scala')
play-scala
OK, application "play-scala" is being created using the "play-scala" template.

To run "play-scala" from the command line, "cd play-scala" then:
D:\projectcase\trunk3\play-scala/activator run

To run the test for "play-scala" from the command line, "cd play-scala" then:
D:\projectcase\trunk3\play-scala/activator test

To run the Activator UI for "play-scala" from the command line, "cd play-scala"
then:
D:\projectcase\trunk3\play-scala/activator ui

```
  1. 建立 eclipse project settings
    切換到 play-scala project 目錄中,然後利用 sbt 建立 eclipse project settings

    D:\projectcase\trunk3\play-scala>sbt eclipse
    [info] Loading global plugins from C:\Users\{user.home}\.sbt\0.13\plugins
    [info] Updating {file:/C:/Users/{user.home}/.sbt/0.13/plugins/}global-plugins...
    [info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-fccfbd44c9f64523b61398a0155784d
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Loading project definition from D:\projectcase\trunk3\play-scala\project
    [info] Updating {file:/D:/projectcase/trunk3/play-scala/project/}play-scala-buil
    d...
    [info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-fccfbd44c9f64523b61398a0155784d
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Set current project to play-scala (in build file:/D:/projectcase/trunk3/p
    lay-scala/)
    [info] About to create Eclipse project files for your project(s).
    [info] Updating {file:/D:/projectcase/trunk3/play-scala/}root...
    [info] Resolving com.fasterxml.jackson.datatype#jackson-datatype-jsr310;2.5.3 ..
    [info] Resolving jline#jline;2.12.1 ...
    [info] Done updating.
    [info] Successfully created Eclipse project files for project(s):
    [info] play-scala
    
  2. 打開 Eclipse ,以 Import Existing Project 的方式,將 play-scala import 到 workspace 中

  3. 在剛剛的「命令提示字元」裡,切換到 scala-play 的目錄,然後鍵入指令 activator run ,就能啟動 play framework web server
    ```
    D:\projectcase\trunk3\play-scala>activator run
    [info] Loading global plugins from C:\Users{user.home}.sbt\0.13\plugins
    [info] Updating {file:/C:/Users/{user.home}/.sbt/0.13/plugins/}global-plugins...
    [info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-fccfbd44c9f64523b61398a0155784d
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Loading project definition from D:\projectcase\trunk3\play-scala\pr
    oject
    [info] Updating {file:/D:/projectcase/trunk3/play-scala/project/}play-scal
    a-intro-build...
    [info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-fccfbd44c9f64523b61398a0155784d
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Set current project to play-scala (in build file:/D:/projectcase/tr
    unk3/play-scala/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.a.l.c.ActorSystemProvider - Starting application default Akka system: a
pplication
[info] p.c.s.NettyServer$ - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)
```

  1. 瀏覽器瀏覽網頁 http://localhost:9000/ 就可以看到 play framework 的測試網頁