Play Framework Project生成war檔給Tomcat執行

最近在研究Play framework遇到的一個發佈上的問題

一個play的project要怎麼生成一個war檔給tomcat執行

在測試的時候直接用activator去啟動就好了

簡單點的就

./activator run

就可以執行了(play過去的版本是用./play去執行)

但是在實務上部署環境有時候會沒有scala可以用,大型一點的應用大概就Nginx+Apache+Tomcat幾種選擇

後來找到了一個plugin可以用

play2-war-plugin

這玩意文件寫得有些複雜,研究這東西也花了點時間,這邊做個筆記

首先要知道自己得play跟tomcat是哪個版本,去下載設定對應的版號

我是用activator-1.3.2去開發,對應的play-war的版本是1.3-beta3

然後線上tomcat是7,對應的play-war的servlet是3.0

對應的對照表在github上查的到

在來就是要修改兩個檔案

修改build.sbt

vim $PROJECT_PATH/build.sbt

增加plugin相對應設定,這邊要注意的是servlet的版號

build.sbt
import com.github.play2war.plugin._
...

Play2WarPlugin.play2WarSettings

Play2WarKeys.servletVersion := "3.0"

完整的檔案設定如下

build.sbt
import com.github.play2war.plugin._

name := """computer-database-scala"""

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.11.4"

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  "org.webjars" % "bootstrap" % "3.3.1",
  "mysql" % "mysql-connector-java" % "5.1.24"
)

lazy val root = (project in file(".")).enablePlugins(PlayScala)

//fork in run := true

Play2WarPlugin.play2WarSettings

Play2WarKeys.servletVersion := "3.0"

修改project/plugins.sbt

vim project/plugins.sbt

新增play2-war的設定

project/plugins.sbt
resolvers += "Play2war plugins release" at "http://repository-play-war.forge.cloudbees.com/release/"

addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.3-beta3")

這邊要注意的是addSbtPlugin每個設定之間要空行,不然會一直跳錯誤

這樣就大功告成了

接下來可以用兩種命令去產生war檔

sbt war

or

./activator war  // 舊版是./play war

之後在target下面就會產生對應的war檔,那個war檔就能夠直接拿到tomcat下執行了

備註

上面的範例在執行sample的hello的範例的時候還蠻順利的

但是在執行computer-database-scala的時候則會跑404出來

查了一下該範例又設定Evolutions

使用./activator執行時候沒問題,但是給tomcat執行就會跑出類似如下錯誤

Database 'default' needs evolution!

看樣子tomcat不會去幫忙執行初始化造成錯誤

這時候要去修正application.conf,加上如下設定去初始化default資料庫

application.conf
...

applyEvolutions.default=true
comments powered by Disqus