動的ページのフレームワークの機能拡張

久しぶりにパーサー部分に機能追加

いままでの動的動作は毎回クラスからオブジェクトをNEWして関数実行していました。
これを、NEWしたオブジェクトに対して関数を複数実行できるように機能拡張。

タグ属性にseedoを定義して、以下のように値を設定する。

クラス名:関数名:引数
クラス名:関数名

<div align="center"  class="xxx" seedo="myapp.HelloWorldTop1:tb:2500" id="asse111" />

スタートタグとエンドタグの間の値を関数実行した返り値と置換します。

一度、指定したクラス名はページが有効である間はオブジェクトが保持されているので、
クラス名が同じで別の関数を設定すれば、NEWしたオブジェクトの関数を実行することができます。

<!doctype html>
<HTML>
<HEAD>
<title>Home</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<h2>Hello world top</h2>
The current time is
<div class="seedo:myapp.HelloWorldDb1:tb">xxxxx</div>
<HR>
<div align="center" class="seedo:myapp.HelloWorldDb1:tb" />
<HR>
<div align="center"  class="xxx" seedo="myapp.HelloWorldTop1:tb:2500" id="asse111" />
<HR>
<table border="1">
<tr>
<th class="xxx" seedo="myapp.HelloWorldTop1:get:2" />
<td seedo="myapp.HelloWorldTop1:getName" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getDept" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getSal" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getJob">job</td>
</tr>
<tr>
<th class="xxx" seedo="myapp.HelloWorldTop1:get:3" />
<td seedo="myapp.HelloWorldTop1:getName" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getDept" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getSal" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getJob">job</td>
</tr>
<tr>
<th class="xxx" seedo="myapp.HelloWorldTop1:get:1" />
<td seedo="myapp.HelloWorldTop1:getName" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getDept" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getSal" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getJob">job</td>
</tr>
<tr>
<th class="xxx" seedo="myapp.HelloWorldTop1:get:0" />
<td seedo="myapp.HelloWorldTop1:getName" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getDept" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getSal" />
<td class="xxx" seedo="myapp.HelloWorldTop1:getJob">job</td>
</tr>
</table>
<HR>
</BODY>
</HTML>

このHTMLをフレームワークで実行すると、

HTMLファイルのなかで使っているHelloWorldTop1 クラスの定義は以下のとおり。

package myapp
import java.util.{HashMap,Date}
import scala.collection.JavaConversions._
import scala.collection.immutable._
import scala.xml._
import seedo.database._

class HelloWorldTop1 extends TmpApp {
  var EMPNO:String = "EMPNO"
  var ENAME:String = "ENAME"
  var SAL:String = "SAL"
  var DEPTNO:String = "DEPTNO"
  var JOB:String = "JOB"
  var MGR:String = "MGR"

  var records:Array[Array[Any]] = null
  def rc(record:Array[Any]) : Unit ={
    EMPNO = if(record(0)!=null){record(0).toString}else{""}
    ENAME = if(record(1)!=null){record(1).toString}else{""}
    SAL = if(record(2)!=null){record(2).toString}else{""}
    DEPTNO = if(record(3)!=null){record(3).toString}else{""}
    JOB = if(record(4)!=null){record(4).toString}else{""}
    MGR = if(record(5)!=null){record(5).toString}else{""}
  }
  def recx(record:Array[Any]) :Node =  {
	var nodes  = Queue.empty[Node]
	record.foreach{(fx) => nodes += <TD>{fx}</TD>}
    return <TR>{nodes}</TR>
  }
  // Function one argument
  def tb(sal:String) : String = {
    tb(sal.toInt)
  }
  def tb(sal:Int) : String = {
    val deptno = parameterMap.get("deptno") match {
      case v:Array[String] => v(0).toInt
      case null => 10
    }
    var sql:Db = null
    try {
		sql = new Db
		sql.select("EMPNO,ENAME,SAL,DEPTNO,JOB,MGR")
			.from("EMP")
			.where("SAL > ?",sal)
			.or("DEPTNO = ?",deptno)
			.orderBy("EMPNO")
		records = sql.executeQuery
		var nodes  = Queue.empty[Node]
		records.foreach{(rec) => {
			nodes += recx(rec)
			rc(rec) // record values 最後のレコードの値が残ることになる。
		  }
		}
		val xml = <table border="2">{nodes}</table>
	    return "HelloWorldDb3 " + new Date + xml.toString
	} catch {
      case e:Exception =>{
        throw e
      }
    } finally {
    	if(sql != null)sql.close
    }
  }
  def get(no:Int) : String = {
    if(records != null && no < records.length) {
    	rc(records(no))
    	return "G E T "+no
    } else {
    	return "Empty"
    }
  }
  def getId : String ={EMPNO}
  def getName : String ={ENAME}
  def getDept : String ={DEPTNO}
  def getJob : String ={JOB}
  def getSal : String ={SAL}
  def getMgr : String ={MGR}
}

フレームワークのコードは以下のとおり。

package ews.servlet.sp

import java.util.HashMap
import org.xml.sax._
import org.xml.sax.helpers.DefaultHandler
import scala.collection.JavaConversions._
import scala.collection.mutable.Stack
import ews.servlet.session._

/**
 * HTMLを直接PrintWriterへ出力する。
 */
class ParserCallback6(pMap:HashMap[String,Array[String]], out:java.io.PrintWriter, session : Session) extends DefaultHandler {
	var buf = new StringBuffer
	val stackChange = new Stack[ExecTag]	// For substitution
	var locator:Locator = null
	var createClasses = new HashMap[String,ExecClass]	// created class
	override def toString : String = buf.toString
	override def setDocumentLocator (locator:Locator) :Unit=  {
		this.locator = locator
	}
	override def startDocument ():Unit= {}
	override def endDocument():Unit= {}
	// タグスタート
	override def startElement ( uri:String,  name:String, qualifiedName:String , attrs:Attributes ):Unit={
		var tag = "<"
		if(name.startsWith("!")){
			tag += name
		} else {
			tag += name.toLowerCase	// tagを小文字で統一する
		}
		var fullFag = false	//
		var seedoFag = false // Page class object
		var end = false		// タグが / で閉じているか?
		for (idx <- 0 to attrs.getLength - 1){
			val attributeType = attrs.getType(idx)
			val attrLocalName = attrs.getLocalName(idx)
		  	val attrName = attrs.getQName(idx)
			val attrValue = attrs.getValue(idx)
			if(attrLocalName.length > 0 && !"#text".equals(attrLocalName)){
				if("/".equals(attrLocalName) && attrValue.length == 0){
					end = true	// tagが閉じた
				} else if("!DOCTYPE".equalsIgnoreCase(name) && "html".equalsIgnoreCase(attrLocalName)){
					tag += " html"
				} else {
					if("class".equals(attrName) && attrValue.startsWith("seedo:")){
						val execCommand = attrValue.split(":")	// Each element is separated.
						if(execCommand.length >= 3) {	// It doesn't substitute it if there are neither a class name nor a function name.
							stackChange.push(new ExecTag(
							0
							,name
							,execCommand
							,new StringBuffer	// The tag to be substituted is maintained.
							,false // class="seedo:...."
							))
							fullFag = true	// 動的タグとして置換状態にある
						} else {
							println("$$$$$$$$$$ execClass Warning " + attrName + "='" + attrValue + "'")
						}
					} else if("seedo".equals(attrName) && attrValue.length > 0){	// Servlet class
						val execCommand = attrValue.split(":")	// Each element is separated.
						if(execCommand.length >= 1) {	// It doesn't substitute it if there are neither a class name nor a function name.
							stackChange.push(new ExecTag(
							0
							,name
							,execCommand
							,new StringBuffer	// The tag to be substituted is maintained.
							,true // SEEDO attribute
							))
							seedoFag = true
						} else {
							println("$$$$$$$$$$ execClass Warning " + attrName + "='" + attrValue + "'")
						}
					} else {
						tag += (" " + attrLocalName)
						if(attrValue != null && !("selected".equalsIgnoreCase(attrLocalName) || "checked".equalsIgnoreCase(attrLocalName) || "disabled".equalsIgnoreCase(attrLocalName) )) {
							tag += ("=\"" + attrValue + "\"")
						}
					}
				}
			}
		}
		tag += ">"

		if(fullFag == true || seedoFag == true){	// 動的タグを記録する
			stackChange.top.setStartTagFull(tag)
			if(end){ // スラでタグが閉じている場合
				if(!stackChange.isEmpty){// Tag inside class="seedo"
					stackChange.top.getBufChange.append(tag)	// 動的タグのオリジナルを設定
					tag += exec		// タグは、動的タグ生成側でタグ付けする。
					stackChange.pop	// The stack for substitution is liberated.
				}
				out.print(tag)
			}
		} else {
			if(stackChange.isEmpty){
				out.print(tag)
			} else {	// 動的タグにネストするタグは置換対象となるため、このタグをバッファに蓄える
				stackChange.top.getBufChange.append(tag)
			}
		}
	}
	// タグエンド
	override def endElement (uri:String ,  name:String, qualifiedName:String):Unit={
		val endTag = "</" + name.toLowerCase +">"
		if(stackChange.isEmpty) {	// Tag to be substituted inside
			out.print(endTag)
		} else {
			stackChange.top.getBufChange.append(endTag)
	  		if(name.equalsIgnoreCase(stackChange.top.getStartTag)) {
	  			var str:String = null
				if(!stackChange.isEmpty){// Tag inside class="seedo"
					str = stackChange.top.getStartTagFull + exec + endTag
					stackChange.pop	// The stack for substitution is liberated.
				}
				if(stackChange.isEmpty){
					out.print(str)
				} else {// class="seedo" 動的タグがネストしている
					stackChange.top.getBufChange.append(str)
				}
	  		}
		}
	}
	// タグ以外
	override def characters(ch:Array[Char],start:Int,length:Int) : Unit = {
		var str:String = ""
		for(i <- start to length+start-1){
			str += ch(i)
		}
		if(stackChange.isEmpty){
			out.print(str)
		} else {// inside tag class="seedo"
			stackChange.top.getBufChange.append(str)
		}
	}
	// 動的タグを実行する
	def exec : String = {
		// Depth of the same stack as tag that became substitution beginning -> tag end
		var changeTag:String = ""
		val execCommand = stackChange.top.getExecCommand
		if(stackChange.top.getSeedo){ // SEEDO attribute
		  return create(execCommand)
		}
		val classname = execCommand(1)	// classnamesをNULLで関数呼び出ししてはいけない
		var method = ""
		try{
			var ec:ExecClass = new ExecClass(classname)		// Object is generated.
			if(ec != null){
				ec.exec("setTag",stackChange.top.getBufChange.toString)	// TAG before it substitutes it is set.
				ec.exec("setParameterMap",pMap)	// GetParameterMap method of ServletRequest to acquire parameter
				ec.exec("setSession",session)	// セッション情報を引き渡す
				if(execCommand.length == 3){	// Argument none
					method = execCommand(2)
					val result = ec.exec(method)
					if(result != null)
						changeTag = result.toString
				} else if(execCommand.length == 4){	// There is one argument.
					method = execCommand(2)
					val value = execCommand(3)
					val result = ec.execStr(method,value)
					if(result != null)
					  changeTag = result.toString
				}
			}
		} catch {
			case e:NoSuchMethodException => {
				println("Exception "+e.getMessage + " NoSuchMethodException! :" + classname + " " + method)
			}
			case e:Exception => {
				println("Exception "+e.getMessage + " class or Method not find! :" + classname + " " + method)
			}
		}
		return changeTag
	}
	// Seedo 動的サブレットクラス・オブジェクトを生成する
	def create(classnames:Array) : String = {
		val classname = classnames(0)	// classnamesをNULLで関数呼び出ししてはいけない
		var method = ""
		var changeTag:String = ""
		var ec:ExecClass = null
		ec = createClasses.get(classname)
		try{
			if(ec == null){	// はじめてクラス名が現れた
				ec = new ExecClass(classname)		// Object is generated.
				if(ec != null){
					createClasses.put(classname, ec)		// 生成したクラス・オブジェクトを登録する
					ec.exec("setParameterMap",pMap)	// GetParameterMap method of ServletRequest to acquire parameter
					ec.exec("setSession",session)	// セッション情報を引き渡す
				}
			}
			if(ec != null){
				if(classnames.length == 2){	// Argument none
					method = classnames(1)
					val result = ec.exec(method)
					if(result != null)
						changeTag = result.toString
				} else if(classnames.length == 3){	// There is one argument.
					method = classnames(1)
					val value = classnames(2)
					val result = ec.execStr(method,value)
					if(result != null)
						changeTag = result.toString
				}
			} else {
				println("Exception :Not create object = " + classname + " " + method)
			}
		} catch {
			case e:NoSuchMethodException => {
				println("Exception "+e.getMessage + " NoSuchMethodException! :" + classname + " " + method)
			}
			case e:Exception => {
				println("Exception "+e.getMessage + " class or Method not find! :" + classname + " " + method)
			}
		}
		return changeTag
	}
}

Comments

comments

Powered by Facebook Comments

Java Object[] を Scala Array にてアクセス

Javaで作ったDBクラスのSelect文の結果を、複数レコードをArrayListで、1レコードをObject[] 配列で返す仕様で作りました。

これをScalaで受け取るには、Java配列をScalaで使うには以下のように書きます。

val f: Array[Object] = record.asInstanceOf[Array[Object]]

これを使ったプログラム。

package ews.servlet

import seedo.database._
import java.io.PrintWriter

class db02 {
	def run(out:PrintWriter) : Unit = {
		val sqlplus = new SqlPlus
		try {
			val records = sqlplus.select("*").from("EMP").whereParam("EMPNO=? OR EMPNO=? OR ENAME=?",Array(new Integer(7788),new Integer(7521),"JONES") ).orderBy("ENAME").executeQuery
			out.println("<table border='1'>")
			for(i <- 0 to records.size-1) {
				val record = records.get(i)
				val f: Array[Object] = record.asInstanceOf[Array[Object]]
				out.println("<tr>")
				for(j <- 0 to f.length-1) {
					out.println("<td>" + (if(f(j)!=null){f(j)}else{""}) + "</td>")
				}
				out.println("</tr>")
			}
			out.println("</table>")
		} finally {
			sqlplus.close
		}
	}
}

可変長引数

Javaの可変長引数についてJDK1.4で可変長引数を使えるように作った whereParam関数。
JDK1.5以降ではwhere関数は…で可変長引数が使える。

引数をArray配列にして渡します。

Comments

comments

Powered by Facebook Comments

Herokuコマンド

Herokuコマンドを使ってみて

パブリック・キーを生成する。

$ ssh-keygen -t rsa

パブリック・キーをHerokuに登録する。

$ heroku keys:add

ログインする

$ heroku login
Enter your Heroku credentials.
Email: xxxxx
Password:

リストする

$ heroku list
radiant-mountain-7703

情報を見る

$ heroku info --app radiant-mountain-7703
=== radiant-mountain-7703
Addons:        Basic Logging, Basic Release Management, Shared Database 5MB
Database Size: (empty)
Git URL:       git@heroku.com:radiant-mountain-7703.git
Owner:         kato@ewavesolutions.com
Repo Size:     74M
Slug Size:     17M
Stack:         cedar
Web URL:       http://radiant-mountain-7703.herokuapp.com/

設定を見る。

$ heroku config
DATABASE_URL        => postgres://qprrsjojjz:LF_nQwyKQ5vT4vMLGc5Y@ec2-107-21-110
-231.compute-1.amazonaws.com/qprrsjojjz
JAVA_OPTS           => -Xmx384m -Xss512k -XX:+UseCompressedOops
MAVEN_OPTS          => -Xmx384m -Xss512k -XX:+UseCompressedOops
PATH                => /usr/local/bin:/usr/bin:/bin
SHARED_DATABASE_URL => postgres://qprrsjojjz:LF_nQwyKQ5vT4vMLGc5Y@ec2-107-21-110
-231.compute-1.amazonaws.com/qprrsjojjz

ログを見る。

$ heroku logs
2012-01-02T14:09:23+00:00 heroku[router]: GET radiant-mountain-7703.her
okuapp.com/db dyno=web.1 queue=0 wait=0ms service=585ms status=200 bytes=2205
2012-01-02T14:10:36+00:00 heroku[router]: HEAD radiant-mountain-7703.he
rokuapp.com/db dyno=web.1 queue=0 wait=0ms service=613ms status=200 bytes=0
2012-01-02T14:40:14+00:00 heroku[router]: GET radiant-mountain-7703.her
okuapp.com/html dyno=web.1 queue=0 wait=0ms service=2588ms status=200 bytes=616
2012-01-02T15:46:06+00:00 heroku[web.1]: Idling
2012-01-02T15:46:07+00:00 heroku[web.1]: State changed from up to down

Herokuのプロセスを見る。

$ heroku ps
Process  State      Command
-------  ---------  --------------------
web.1    up for 1h  sh target/bin/webapp

Herokuのプロセスを再起動する。

$ heroku restart
Restarting processes... done

設定されているパブリック・キーを見る。

heroku keys

Comments

comments

Powered by Facebook Comments

Heroku: Java Web Application using Embedded Tomcat & Scala

Heroku を使っていろいろ試している人のページを参考にして何とかScalaで動くところまできています。

挑戦者に感謝!

最初はなかなかうまく動いてくれない。でも動くといろいろ試したくなります。

Herokuのローカル環境。
私の現在のフォルダ構成は以下の通りです。

Jetty版も動かしているのですが、
長年付き合ってきたTOMCATが好きです。

今回はじめて Embedded Tomcat を使ったのですが、ドキュメントがないのに苦労します。JAVADOCだけではよくわからないし。皆さんはどうやっているのでしょうか。

Main.javaでは、クラスローダーでJarファイルを独自に読み込むコードも書いてみたのですが、思い通りに動かないものです。

これも私の基礎がなっていことが原因なんですけどね。

Comments

comments

Powered by Facebook Comments

Heroku Embedded Tomcat + Scala2.9.1 + Oracle Database

ScalaでOracle11g データベースをJDBCドライバで純粋にアクセスするコードを書いてみます。

javax.servlet.annotation.WebServlet のアノテーションを使います。Tomcat7のServlet Ver3 ですから。

@WebServlet(Array(“/html”)) と書けるところがいい。

package ews.servlet

import java.io.IOException
import java.util.Date
import java.util._
import javax.servlet.ServletException
import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@WebServlet(Array("/html"))
class htmlSrv extends HttpServlet {
	override def doGet(request : HttpServletRequest, response : HttpServletResponse) : Unit = {
		val out = response.getWriter
		response.setContentType("text/html; charset=UTF-8");

		out.println("<html><body>")
		out.println("hello scala " + new java.util.Date)

		val db = new db01
		db.run(out)

		out.println("</body></html>")
		out.flush
		out.close
	}
}



OracleJDBCドライバのサンプルコードをScalaで書き換えます。

DriverManager のOracleサーバのIPアドレスは稼働するアドレスを指定します。(以下はサンプルです)

package ews.servlet

import java.io.IOException
import java.util.Date
import java.util._
import seedo.database._
import java.sql._
import oracle.jdbc._
import oracle.jdbc.pool.OracleDataSource
import java.io.PrintWriter

class db01 {
	def run(out:PrintWriter) : Unit = {
		// Oracle JDBC Driverのロード
		Class.forName("oracle.jdbc.driver.OracleDriver");
		// Oracle11g に接続
		val conn = DriverManager.getConnection("jdbc:oracle:thin:@111.111.111.111:1521:orcl11g", "scott", "tiger")
		// ステートメントを作成
		val stmt = conn.createStatement
		// 問合せの実行
		val rset = stmt.executeQuery("select EMPNO, ENAME from EMP order by ENAME")
		// 問合せ結果の表示
		out.println("<table>")
		while ( rset.next() ) {
			// 列番号による指定
			out.println("<tr><td>"+rset.getInt(1) + "</td><td>" + rset.getString(2)+"</td></tr>")
		}
		out.println("</table>")
		// 結果セットをクローズ
		rset.close
		// ステートメントをクローズ
		stmt.close
		// 接続をクローズ
		conn.close
	}
	def db : Unit = {
		// Prompt the user for connect information
		System.out.println("Please enter information to test connection to the database")
		var user = "scott"
		var password = "tiger"
		var database = "orcl11g"

		print("Connecting to the database...")
		println("Connecting...")
		// Open an OracleDataSource and get a connection
		val ods = new OracleDataSource
		ods.setURL("jdbc:oracle:thin:@111.111.111.111:1521:orcl11g");
		ods.setUser(user);
		ods.setPassword(password);
		val conn = ods.getConnection();
		println("connected.")

		// Create a statement
		val stmt = conn.createStatement

		// Do the SQL "Hello World" thing
		val rset = stmt.executeQuery("select 'Hello World' from dual")

		while (rset.next()){
			println(rset.getString(1))
		}
		// close the result set, the statement and the connection
		rset.close
		stmt.close
		conn.close
		println("Your JDBC installation is correct.");
	}
}



実際のHEROKUの画面はこんな感じです。

http://radiant-mountain-7703.herokuapp.com/html

ScalaでOKです。

このソースコードでの障害を1つ。

最初は、htmlSrv.scalaファイル1つだったのですが、

import java.sql._

を追加すると、

@WebServlet(Array(“/html”))

のArrayクラスが定義できないとコンパイラからエラー。

これはjava.sql._ライブラリにArrayクラスが独自に定義されていることが原因。

面倒なので、別のクラスにして逃げています。

こんなもんのです。プログラム作るってことは。

Comments

comments

Powered by Facebook Comments

Heroku Embedded Tomcat + Scala2.9.1

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 とくれば成功!

Comments

comments

Powered by Facebook Comments

Heroku Embedded Tomcat + Seedo DB framework(Scala) + Oracle11g & MySQL5.5

明けましておめでとうございます。

Heroku Embedded Tomcat Scala の設定が完成しました。

基本は、次のpom.xml ファイルです。

これでScalaがHerokuで動きます。それもLiftでもPlay! でもなく。
まったく独立して、それもOracle11gやMySQLを使って。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.heroku.seedo</groupId>
  <artifactId>embeddedTomcatSeedo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>embeddedTomcatSeedo Maven Webapp</name>
  <properties>
    <scala.version>2.9.1</scala.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <repositories>
    <repository>
      <id>maven.apache.org</id>
      <name>Maven Apache</name>
      <url>http://maven.apache.org</url>
    </repository>
    <repository>
      <id>seedo.co.jp</id>
      <name>Seedo Repository</name>
      <url>http://www.ewavesolutions.com/seedorepo/</url>
    </repository>
    <repository>
      <id>scala-tools.releases</id>
      <name>Scala-Tools Dependencies Repository for Releases</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.releases</id>
      <name>Scala-Tools Plugins Repository for Releases</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-core</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-logging-juli</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jasper</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jasper-el</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jsp-api</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-dbcp</artifactId>
      <version>7.0.23</version>
    </dependency>
    <dependency>
      <groupId>oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11</version>
    </dependency>
    <dependency>
      <groupId>oracle</groupId>
      <artifactId>orai18n</artifactId>
      <version>11</version>
    </dependency>
    <dependency>
      <groupId>oracle</groupId>
      <artifactId>mysql_connectory_java</artifactId>
      <version>5.1.17</version>
    </dependency>
    <dependency>
      <groupId>seedo</groupId>
      <artifactId>seedo</artifactId>
      <version>1</version>
    </dependency>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-compiler</artifactId>
      <version>${scala.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.scala-tools.testing</groupId>
      <artifactId>specs_2.9.1</artifactId>
      <version>1.6.9</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <resources>
      <resource>
        <directory>src/main/webapp</directory>
      </resource>
    </resources>
    <finalName>embeddedTomcatSeedo</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.9.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
          <charset>${project.build.sourceEncoding}</charset>
          <jvmArgs>
            <jvmArg>-Xmx1024m</jvmArg>
            <jvmArg>-DpackageLinkDefs=file://${project.build.directory}/packageLinkDefs.properties</jvmArg>
          </jvmArgs>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <executions>
          <execution>
            <id>default-copy-resources</id>
            <phase>process-resources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <overwrite>true</overwrite>
              <outputDirectory>${project.build.directory}</outputDirectory>
              <resources>
                <resource>
                  <directory>${project.basedir}/src</directory>
                  <includes>
                    <include>packageLinkDefs.properties</include>
                  </includes>
                  <filtering>true</filtering>
                </resource>
              </resources>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>appassembler-maven-plugin</artifactId>
        <version>1.1.1</version>
        <configuration>
          <assembleDirectory>target</assembleDirectory>
          <programs>
            <program>
              <mainClass>launch.Main</mainClass>
              <name>webapp</name>
            </program>
          </programs>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>assemble</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

以下のURLで実際にアクセスしてください。

http://radiant-mountain-7703.herokuapp.com/

DBをアクセスして一覧にするページは次のURLです。

http://radiant-mountain-7703.herokuapp.com/db

Comments

comments

Powered by Facebook Comments

Heroku Embedded Tomcat + Seedo DB framework(Java) + MySQL

HEROKU JAVA + MySQL

HEROKUとSeedo DB フレームワーク(Java)によるMySQLへの対応は、env.propertiesファイルを以下のように書き換えます。
ZZZはIPアドレスを書きます。

driver = com.mysql.jdbc.Driver
jdbc = jdbc:mysql://ZZZ.ZZZ.ZZZ.ZZZ:3306/seedo?useUnicode=true&characterEncoding=UTF-8
user = scott
password = tiger

さきのOracleDB同様にHEROKUからインターネットを経由して、MySQLに直接JDBCによってアクセスします。
env.propertiesファイルのDB接続定義を書き換えるだけでOKです。

pom.xmlファイルには以下のように、MySQLのJDBCドライバ用Jarファイルをダウンロードできるようにdependencyタグを追加します。

    
      oracle
      mysql_connectory_java
      5.1.17
    

データベースは、クラウドではなく自分か管理しているDBサーバーを使うというシステム構成です。セキュリティ上は好ましくはないです。MySQLはアクセスするIPアドレスを特定できるので最低でもこの設定は必要でしょう。
これらのコードは実験的なものです。

Servlet 3.0

Servletは、TOMCAT7がサポートしている
Servlet 3.0の主要なテーマの1つであるEoDです。
Servlet 3.0では、EoDとして「Annotation based configuration」を新しく定義しました。アノテーションを利用することでServletの開発が簡単になります。

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import seedo.*;
import seedo.database.*;

@WebServlet(
	name = "DbServlet",
	urlPatterns = {"/db"}
)
public class DbServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//		ServletOutputStream out = resp.getOutputStream();
	    PrintWriter out = resp.getWriter();
    	resp.setContentType("text/html; charset=Shift_JIS");

		out.println("<html><body>");
        out.println("hello heroku db");
		db(out);
		out.println("</body></html>");
		out.flush();
		out.close();
    }
	private void db(PrintWriter out) {
		SqlPlus sqlplus = null;
		try {
			sqlplus = new SqlPlus();
			List<Object []> result1 = sqlplus.select("*").from("EMP").orderBy("ename").executeQuery();
			out.println("<TABLE border='1'>");
			for(int i = 0;i < result1.size();i++){
				Object [] record = result1.get(i);
				out.println("<TR><TH>No."+ i + "</TH>");
				for(int j = 0;j < record.length;j++){
					out.println("<TD>" + (record[j] != null?record[j].toString():"") + "</TD>");
				}
				out.println("</TR>");
			}
			out.println("</TABLE>");
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			sqlplus.close();
		}
	}
}

Servlet2.5では、次のように作成したサーブレットをweb.xmlにマッピングしなければなりませんでした。


  DbServlet
  servlet.DbServlet



  DbServlet
  /db

「Annotation based configuration」を利用すると、「@WebServlet」というアノテーションを付加するだけでOKです。

HEROKUのGet Startingにある、HelloServlet の@WebServletコード部分を少しだけ変更してみました。

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
        name = "HelloServlet",
        urlPatterns = {"/hello"}
    )
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        ServletOutputStream out = resp.getOutputStream();
        out.write("hello heroku".getBytes());
        out.flush();
        out.close();
    }
}

Test
HEROKUにアップロードする前にローカルPCの上で、

target\bin\webapp.batファイルを実行して、ブラウザから以下の2つのURLをアクセスすることができます。

DbServlet は、以下のURLです。

http://127.0.0.1:8080/db

HelloServlet は、以下のURLです。

http://127.0.0.1:8080/hello

Comments

comments

Powered by Facebook Comments

Heroku Embedded Tomcat + Seedo DB framework(Java) + Oracle11g

HEROKUからOracle11gにアクセスして動くWebアプリケーション

Herokuで動くEmbedded Tomcat7から、インターネット上にあるOracle11gにアクセスするJava Webアプリケーションです。まだScalaではありません。
このコードは動作テスト用に作ったものだということを予めお断りしておきます。また、実際のシステム構成としては望ましいものではありません。

OracleDBへのアクセスは、OracleのJDBCドライバとSeedoDBフレームワークを使っています。このJarファイルは以下のPOM.XMLファイルにあるリポジトリからダウンロードして、に依存関係のあるJarファイルを定義しています。

<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
  xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.heroku.seedo</groupId>
  <artifactId>embeddedTomcatSeedo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>embeddedTomcatSeedo Maven Webapp</name>
  <repositories>
    <repository>
      <id>maven.apache.org</id>
      <name>Maven Apache</name>
      <url>http://maven.apache.org</url>
    </repository>
    <repository>
      <id>seedo.co.jp</id>
      <name>Seedo Repository</name>
      <url>http://www.ewavesolutions.com/seedorepo/</url>
    </repository>
  </repositories>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-core</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-logging-juli</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jasper</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jasper-el</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jsp-api</artifactId>
      <version>7.0.22</version>
    </dependency>
    <dependency>
      <groupId>oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11</version>
    </dependency>
    <dependency>
      <groupId>oracle</groupId>
      <artifactId>orai18n</artifactId>
      <version>11</version>
    </dependency>
   <dependency>
      <groupId>seedo</groupId>
      <artifactId>seedo</artifactId>
      <version>1</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>embeddedTomcatSeedo</finalName>
    <plugins>
      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>appassembler-maven-plugin</artifactId>
          <version>1.1.1</version>
          <configuration>
              <assembleDirectory>target</assembleDirectory>
              <programs>
                  <program>
                      <mainClass>launch.Main</mainClass>
                      <name>webapp</name>
                  </program>
              </programs>
            </configuration>
          <executions>
              <execution>
                  <phase>package</phase>
                  <goals>
                      <goal>assemble</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
    </plugins>
  </build>
</project>

JSPファイルは、sqlplus1.jsp として、

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page language="java" %>
<%@ page import = "java.util.Date" %>
<%@ page import = "java.util.List" %>
<%@ page import = "java.io.*" %>
<%@ page import = "javax.servlet.*" %>
<%@ page import = "javax.servlet.http.*" %>
<%@ page import = "seedo.*" %>
<%@ page import = "seedo.database.*" %>
<jsp:useBean id="date" class="java.util.Date" />
<%
	SqlPlus sqlplus = new SqlPlus();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META content="text/html; charset=UTF-8" http-equiv="Content-type">
<TITLE>SeeDo SqlPlus</TITLE>
</HEAD>
<BODY>
<%= date.toString() %><BR/>
<HR/>
<%= sqlplus.getTableList().toString() %>
<HR/>
総数=<%= sqlplus.execute("select * from emp").getResultSize() %>
<TABLE border="1">
<%
try{
	List<Object []> result1 = sqlplus.getResult();
	for(int i = 0;i < result1.size();i++){
		Object [] record = result1.get(i);
		out.print("<TR><TH>No."+ i + "</TH>");
		for(int j = 0;j < record.length;j++){
			out.print("<TD>" + (record[j] != null ? record[j].toString():"") + "</TD>");
		}
		out.print("</TR>");
	}

%>
</TABLE>
<HR/>
<%
} catch (Exception ex) {
	ex.printStackTrace();
} finally {
	sqlplus.close();
}
%>
</BODY>
</HTML>

ブラウザの画面は以下の通りです。
EMP表の内容が一覧表示されます。

SeedoDBフレームワーク用のDB接続定義情報は、
env.propertiesファイルに記述します。このファイルは、HEROKUフォルダの直下に置きます。
DBフレームワークでは、OracleDBとMySQLとが使えます。
#はコメントです。
-----------------------------------

driver = oracle.jdbc.driver.OracleDriver
#driver = com.mysql.jdbc.Driver

#jdbc = jdbc:mysql://XXX.XXX.XXX.XXX:3306/ABCDEFG?useUnicode=true&characterEncoding=UTF-8
jdbc = jdbc:oracle:thin:@YYY.YYY.YYY.YYY:1521:ORCL
user = scott
password = tiger

-----------------------------------

IPアドレスは、XXXやYYYの部分です。
MySQLのDB名は、ABCDEFGとなっていますし、OracleSIDはORCLと定義しているので、ここも実際のDB名やSIDを書きます。

開発環境側のフォルダ構成は以下のようになります。

ここでミソなのが、依存するJarファイルをインターネット上に置いて、ダウンロードできるようにすることです。
POM.XMLのなかで以下のように定義すると、seedo-1.jarがダウンロードされます。

   
      seedo
      seedo
      1
    

リポジトリ上のJarファイルは、以下のURLでアクセスできるようにしなければなりません。

http://www.ewavesolutions.com/seedorepo/seedo/seedo/1/seedo-1.jar

Comments

comments

Powered by Facebook Comments

HEROKU のサポート

Herokuへのディプロイまでは成功したのに、生成されたHEROKUサイトへのアクセスがうまくいかない。
その理由は、Procfileファイルがなかったこと。

このことがわからなくて、HEROKUのサポートチケットを使って、うまくいかないことを問い合わせました。
回答は翌日届き、事なきを得ました。
HEROKUサイトへのアクセスができたわけです。
こんない早く回答されたことに正直驚きました。

HEROKU用の環境は、FEDORAのようなLINUXで構築すると、HEROKUの Getting Started にあるように操作できます。しかし、WindowsでHEROKU用の環境を作る場合、少し工夫が必要になります。

Windowsのコマンド環境には、

コマンドプロンプトと呼ばれるDOS窓
Gitのコマンドライン
Cygwinターミナル

Gitはインストールするときに、UNIXコマンドが使えるようにするかが訊ねられます。
Cygwinは、DOS窓とは違いますが、DOSコマンドが実行できます。

target/bin/フォルダに下に生成される、
webapp ファイルと、webapp.bat ファイル。

webapp.batをDOS窓で実行すると、問題なくJavaアプリが動作します。
webapp はシェルスクリプトなので、Cygwinターミナルで

sh webapp

とコマンドを実行するとうまくいきますが、
Gitコマンドラインではクラスがないと、起動できません。

DOS窓も同様で、

C:\Users\XXX\workspace\HerokuJava\target\bin>sh webapp
エラー: メイン・クラスHelloWorldが見つからなかったかロードできませんでした

ruby環境も、foremanコマンドがうまく実行できない。

foreman start

パスの問題なんだけど。

Comments

comments

Powered by Facebook Comments

HerokuにEmbedded TomcatヘJava Web Applicationを作る。その2

HEROKUへのデプロイ

Gitをコミットします。

$ git init
$ git add .
$ git commit -m "Ready to deploy"

Cedar stackにアプリを生成します。

$ heroku create --stack cedar
Creating cold-river-5491... done, stack is cedar
http://cold-river-5491.herokuapp.com/ | git@heroku.com:cold-river-5491.git
Git remote heroku added

コードをディプロイします。

$ git push heroku master
The authenticity of host 'heroku.com (50.19.85.154)' can't be established.
RSA key fingerprint is aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'heroku.com,50.19.85.154' (RSA) to the list of known
hosts.
Counting objects: 89, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (71/71), done.
Writing objects: 100% (89/89), 4.71 MiB | 103 KiB/s, done.
Total 89 (delta 16), reused 0 (delta 0)

-----> Heroku receiving push
-----> Java app detected
-----> Installing Maven 3.0.3..... done
-----> Installing settings.xml..... done
-----> executing /app/tmp/repo.git/.cache/.maven/bin/mvn -B -Duser.home=/tmp/bui
ld_2v7e7w2fkh8ke -Dmaven.repo.local=/app/tmp/repo.git/.cache/.m2/repository -s /
app/tmp/repo.git/.cache/.m2/settings.xml -DskipTests=true clean install
       [INFO] Scanning for projects...
       [INFO]

       [INFO] ------------------------------------------------------------------
------
       [INFO] Building embeddedTomcatSample Maven Webapp 1.0-SNAPSHOT
       [INFO] ------------------------------------------------------------------
------
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-core/7.0.22/tomcat-embed-core-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-core/7.0.22/tomcat-embed-core-7.0.22.pom (2 KB at 5.0 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.pom (2 KB at 10.0
KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-jasper/7.0.22/tomcat-embed-jasper-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-jasper/7.0.22/tomcat-embed-jasper-7.0.22.pom (2 KB at 8.5 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ja
sper/7.0.22/tomcat-jasper-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jas
per/7.0.22/tomcat-jasper-7.0.22.pom (3 KB at 20.8 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-se
rvlet-api/7.0.22/tomcat-servlet-api-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ser
vlet-api/7.0.22/tomcat-servlet-api-7.0.22.pom (2 KB at 7.1 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ju
li/7.0.22/tomcat-juli-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jul
i/7.0.22/tomcat-juli-7.0.22.pom (2 KB at 6.5 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-js
p-api/7.0.22/tomcat-jsp-api-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jsp
-api/7.0.22/tomcat-jsp-api-7.0.22.pom (2 KB at 12.2 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-el
-api/7.0.22/tomcat-el-api-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-el-
api/7.0.22/tomcat-el-api-7.0.22.pom (2 KB at 9.2 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/eclipse/jdt/core/compil
er/ecj/3.7/ecj-3.7.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/eclipse/jdt/core/compile
r/ecj/3.7/ecj-3.7.pom (2 KB at 7.6 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ja
sper-el/7.0.22/tomcat-jasper-el-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jas
per-el/7.0.22/tomcat-jasper-el-7.0.22.pom (2 KB at 16.4 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ap
i/7.0.22/tomcat-api-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-api
/7.0.22/tomcat-api-7.0.22.pom (2 KB at 4.5 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ut
il/7.0.22/tomcat-util-7.0.22.pom
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-uti
l/7.0.22/tomcat-util-7.0.22.pom (2 KB at 5.4 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-core/7.0.22/tomcat-embed-core-7.0.22.jar
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tom
cat-embed-jasper/7.0.22/tomcat-embed-jasper-7.0.22.jar
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ja
sper/7.0.22/tomcat-jasper-7.0.22.jar
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-se
rvlet-api/7.0.22/tomcat-servlet-api-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ser
vlet-api/7.0.22/tomcat-servlet-api-7.0.22.jar (173 KB at 719.6 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ju
li/7.0.22/tomcat-juli-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar (38 KB at 135.
2 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-el
-api/7.0.22/tomcat-el-api-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jas
per/7.0.22/tomcat-jasper-7.0.22.jar (577 KB at 2028.9 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/eclipse/jdt/core/compil
er/ecj/3.7/ecj-3.7.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-jasper/7.0.22/tomcat-embed-jasper-7.0.22.jar (768 KB at 2459.8 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ap
i/7.0.22/tomcat-api-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jul
i/7.0.22/tomcat-juli-7.0.22.jar (38 KB at 260.1 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ut
il/7.0.22/tomcat-util-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-el-
api/7.0.22/tomcat-el-api-7.0.22.jar (43 KB at 305.4 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-ja
sper-el/7.0.22/tomcat-jasper-el-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-api
/7.0.22/tomcat-api-7.0.22.jar (7 KB at 46.9 KB/sec)
       Downloading: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-js
p-api/7.0.22/tomcat-jsp-api-7.0.22.jar
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-uti
l/7.0.22/tomcat-util-7.0.22.jar (23 KB at 180.1 KB/sec)
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/embed/tomc
at-embed-core/7.0.22/tomcat-embed-core-7.0.22.jar (2379 KB at 4600.9 KB/sec)
       Downloaded: http://s3pository.heroku.com/jvm/org/eclipse/jdt/core/compile
r/ecj/3.7/ecj-3.7.jar (1671 KB at 5405.4 KB/sec)
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jsp
-api/7.0.22/tomcat-jsp-api-7.0.22.jar (87 KB at 515.5 KB/sec)
       Downloaded: http://s3pository.heroku.com/jvm/org/apache/tomcat/tomcat-jas
per-el/7.0.22/tomcat-jasper-el-7.0.22.jar (120 KB at 474.3 KB/sec)
       [INFO]
       [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ embeddedTomca
tSample ---
       [INFO] Deleting /tmp/build_2v7e7w2fkh8ke/target
       [INFO]
       [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ e
mbeddedTomcatSample ---
       [INFO] Using 'UTF-8' encoding to copy filtered resources.
       [INFO] skip non existing resourceDirectory /tmp/build_2v7e7w2fkh8ke/src/m
ain/resources
       [INFO]
       [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ embedd
edTomcatSample ---
       [INFO] Compiling 2 source files to /tmp/build_2v7e7w2fkh8ke/target/classe
s
       [INFO]
       [INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResour
ces) @ embeddedTomcatSample ---
       [INFO] Using 'UTF-8' encoding to copy filtered resources.
       [INFO] skip non existing resourceDirectory /tmp/build_2v7e7w2fkh8ke/src/t
est/resources
       [INFO]
       [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile)
@ embeddedTomcatSample ---
       [INFO] No sources to compile
       [INFO]
       [INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ embeddedTomc
atSample ---
       [INFO] Tests are skipped.
       [INFO]
       [INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ embeddedTomcatSampl
e ---
       [INFO] Building jar: /tmp/build_2v7e7w2fkh8ke/target/embeddedTomcatSample
.jar
       [INFO]
       [INFO] --- appassembler-maven-plugin:1.1.1:assemble (default) @ embeddedT
omcatSample ---
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/embed/tomcat-embed-core/7.0.22/tomcat-embed-core-7.0.22.jar to /tmp/build_2v7
e7w2fkh8ke/target/repo/org/apache/tomcat/embed/tomcat-embed-core/7.0.22/tomcat-e
mbed-core-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/embed/tomcat-embed-logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar t
o /tmp/build_2v7e7w2fkh8ke/target/repo/org/apache/tomcat/embed/tomcat-embed-logg
ing-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/embed/tomcat-embed-jasper/7.0.22/tomcat-embed-jasper-7.0.22.jar to /tmp/build
_2v7e7w2fkh8ke/target/repo/org/apache/tomcat/embed/tomcat-embed-jasper/7.0.22/to
mcat-embed-jasper-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-jasper/7.0.22/tomcat-jasper-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/tar
get/repo/org/apache/tomcat/tomcat-jasper/7.0.22/tomcat-jasper-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-servlet-api/7.0.22/tomcat-servlet-api-7.0.22.jar to /tmp/build_2v7e7w2
fkh8ke/target/repo/org/apache/tomcat/tomcat-servlet-api/7.0.22/tomcat-servlet-ap
i-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-juli/7.0.22/tomcat-juli-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/target/
repo/org/apache/tomcat/tomcat-juli/7.0.22/tomcat-juli-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-el-api/7.0.22/tomcat-el-api-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/tar
get/repo/org/apache/tomcat/tomcat-el-api/7.0.22/tomcat-el-api-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/eclipse/jdt
/core/compiler/ecj/3.7/ecj-3.7.jar to /tmp/build_2v7e7w2fkh8ke/target/repo/org/e
clipse/jdt/core/compiler/ecj/3.7/ecj-3.7.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-api/7.0.22/tomcat-api-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/target/re
po/org/apache/tomcat/tomcat-api/7.0.22/tomcat-api-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-util/7.0.22/tomcat-util-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/target/
repo/org/apache/tomcat/tomcat-util/7.0.22/tomcat-util-7.0.22.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-jasper-el/7.0.22/tomcat-jasper-el-7.0.22.jar to /tmp/build_2v7e7w2fkh8
ke/target/repo/org/apache/tomcat/tomcat-jasper-el/7.0.22/tomcat-jasper-el-7.0.22
.jar
       [INFO] Installing /app/tmp/repo.git/.cache/.m2/repository/org/apache/tomc
at/tomcat-jsp-api/7.0.22/tomcat-jsp-api-7.0.22.jar to /tmp/build_2v7e7w2fkh8ke/t
arget/repo/org/apache/tomcat/tomcat-jsp-api/7.0.22/tomcat-jsp-api-7.0.22.jar
       [INFO] Installing /tmp/build_2v7e7w2fkh8ke/target/embeddedTomcatSample.ja
r to /tmp/build_2v7e7w2fkh8ke/target/repo/com/heroku/sample/embeddedTomcatSample
/1.0-SNAPSHOT/embeddedTomcatSample-1.0-SNAPSHOT.jar
       [INFO]
       [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ embedde
dTomcatSample ---
       [INFO] Installing /tmp/build_2v7e7w2fkh8ke/target/embeddedTomcatSample.ja
r to /app/tmp/repo.git/.cache/.m2/repository/com/heroku/sample/embeddedTomcatSam
ple/1.0-SNAPSHOT/embeddedTomcatSample-1.0-SNAPSHOT.jar
       [INFO] Installing /tmp/build_2v7e7w2fkh8ke/pom.xml to /app/tmp/repo.git/.
cache/.m2/repository/com/heroku/sample/embeddedTomcatSample/1.0-SNAPSHOT/embedde
dTomcatSample-1.0-SNAPSHOT.pom
       [INFO] ------------------------------------------------------------------
------
       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------
------
       [INFO] Total time: 6.654s
       [INFO] Finished at: Tue Dec 20 16:20:46 UTC 2011
       [INFO] Final Memory: 10M/490M
       [INFO] ------------------------------------------------------------------
------
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 5.4MB
-----> Launching... done, v5
       http://cold-river-5491.herokuapp.com deployed to Heroku

To git@heroku.com:cold-river-5491.git
 * [new branch]      master -> master

BUILD SUCCESSと表示されれば成功です。

HEROKUのサイトをブラウザでアクセスします。

$ heroku open

以下のURLでHEROKUのアプリがアクセスできます。

http://cold-river-5491.herokuapp.com/

http://cold-river-5491.herokuapp.com/hello

当分、アクセスできると思います。

Comments

comments

Powered by Facebook Comments