Embedded Tomcat7 をランチするScala Object のソースコードです。
Heroku/src/main/scala/launch/Main.scala ファイルです。
このMainオブジェクトは先に書いたMain.javaをScalaコードに書き換えたものです。
package launch import java.util._ import java.net.URL import java.net.MalformedURLException import java.net.URLClassLoader import java.io.File import java.io.IOException import java.io.Writer import javax.servlet.Servlet import javax.servlet.ServletException import javax.servlet.http.HttpServlet import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import org.apache.catalina._ import org.apache.catalina.connector.Connector import org.apache.catalina.core.StandardHost import org.apache.catalina.core.StandardServer import org.apache.catalina.core.AprLifecycleListener import org.apache.catalina.startup.Embedded import org.apache.catalina.startup.Tomcat import org.apache.coyote.http11.AbstractHttp11JsseProtocol import org.apache.tomcat.util.IntrospectionUtils object Main { def main(args: Array[String]): Unit = { val webappDirLocation = "src/main/webapp/" val tomcat = new Tomcat //The port that we should run on can be set into an environment variable //Look for that variable and default to 8080 if it isn't there. var webPort = System.getenv("PORT") if(webPort == null || webPort.isEmpty()) { webPort = "8080" } tomcat.setPort(Integer.valueOf(webPort)) var appBase = new File(webappDirLocation).getAbsolutePath val contextPath = "/" // Add AprLifecycleListener val server = tomcat.getServer var listener = new AprLifecycleListener server.addLifecycleListener(listener) val configFile = new File("META-INF/context.xml") val context = tomcat.addWebapp(contextPath, appBase) context.setConfigFile(configFile.toURI().toURL()) println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath()) tomcat.enableNaming tomcat.start tomcat.getServer().await } }
このコードの特徴は、
META-INF/context.xml を読み込んでいることです。
これでTomcat7のJDBCコネクション・プールが使えるようになります。
最初のアクセスはDBセッションを作るので遅いですが、それ以降はセッションがプールから得られるので早いです。
META-INF/context.xml ファイルの内容は、
ここまで来るには、いろいろと障害がある訳です。
ローカルの環境で動いたからといっても、Herokuで動くとは限らない。
その障害の1つ。
Main.javaの環境があるとところでこのScalaオブジェクトがあると、HerokuへファイルをアップロードするとすでにMain.javaがあるからとエラーとなってしまいました。
これを回避するには、ローカル環境にある.gitフォルダをいったんすべて削除してから、
Deploy to Herokuしました。
Commit your changes to Git:
$ git init $ git add . $ git commit -m "Ready to deploy"
新しいインスタンスを作ります。
Create the app on the Cedar stack:
$ heroku create --stack cedar
インストールが成功すると以下のようにメッセージされます。
Deploy your code:
$ git push heroku master ............ [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ embedde dTomcatSeedo --- [INFO] Installing /tmp/build_22ibt93uw91ys/target/embeddedTomcatSeedo.jar to /app/tmp/repo.git/.cache/.m2/repository/com/heroku/seedo/embeddedTomcatSeedo /1.0-SNAPSHOT/embeddedTomcatSeedo-1.0-SNAPSHOT.jar [INFO] Installing /tmp/build_22ibt93uw91ys/pom.xml to /app/tmp/repo.git/. cache/.m2/repository/com/heroku/seedo/embeddedTomcatSeedo/1.0-SNAPSHOT/embeddedT omcatSeedo-1.0-SNAPSHOT.pom [INFO] ------------------------------------------------------------------ ------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------ ------ [INFO] Total time: 1:33.414s [INFO] Finished at: Mon Jan 02 14:03:43 UTC 2012 [INFO] Final Memory: 13M/490M [INFO] ------------------------------------------------------------------ ------ -----> Discovering process types Procfile declares types -> web -----> Compiled slug size is 17.8MB -----> Launching... done, v5 http://radiant-mountain-7703.herokuapp.com deployed to Heroku To git@heroku.com:radiant-mountain-7703.git * [new branch] master -> master ewave@WYOMING ~/workspace/heroku (master) $
[INFO] BUILD SUCCESS とくれば成功!