Scala+DBMS+Web スカラ座の夜

2011年12月21日

HEROKU のサポート

Filed under: Java — admin @ 2:16 AM

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

パスの問題なんだけど。

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

Filed under: Java — admin @ 1:36 AM

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

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

2011年12月17日

HerokuにEmbedded TomcatヘJava Web Applicationを作る

Filed under: Java — admin @ 12:39 AM

HEROKUが正式にScala言語をサポートしたということで、その前段としてJavaアプリケーションを作ってみました。

詳細は、HEROKUの開発者向けページの以下のURLに説明があります。

http://devcenter.heroku.com/articles/create-a-java-web-application-using-embedded-tomcat

まずは、前提となる環境を作ります。

1. JVMをインストールします。
  現在のJava環境は、Java Platform, Standard Edition のJava SE 7 Update 1をインストールしています。

以下のURLからインストール用のJDKをダウンロードします。
http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html

2. Maven環境は、次のようになっています。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

Maven環境は、

C:> mvn -version
Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900)
Maven home: C:\apache-maven-3.0.3\bin\..
Java version: 1.7.0_01, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_01\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

以下のURLからダウンロードできます。
http://maven.apache.org/download.html
http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.0.3-bin.zip

Maven 2.2.1でもOKです。新しいもの好きなので3.0.3を使っています。

3. Git
使っているバージョンは以下のものですが、この文章を書いているときの最新はv1.7.7.5です。

Welcome to Git (version 1.7.6-preview20110708)

Gitは以下のURLからダウンロードできます。
http://git-scm.com/

これらをPCにインストールします。

4. pom.xml
Mavenを使うには、pom.xmlを定義します。
これは、HEROKUには、


4.0.0
com.heroku.sample
embeddedTomcatSample
1.0-SNAPSHOT
embeddedTomcatSample Maven Webapp
http://maven.apache.org


org.apache.tomcat.embed
tomcat-embed-core
7.0.22


org.apache.tomcat.embed
tomcat-embed-logging-juli
7.0.22


org.apache.tomcat.embed
tomcat-embed-jasper
7.0.22


org.apache.tomcat
tomcat-jasper
7.0.22


org.apache.tomcat
tomcat-jasper-el
7.0.22


org.apache.tomcat
tomcat-jsp-api
7.0.22



embeddedTomcatSample org.codehaus.mojo
appassembler-maven-plugin
1.1.1

target launch.Main
webapp


package
assemble



このファイルを、Eclipseからも使いたいので、
C:\User\XXX\workspace\Heroku\ディレクトリに置きます。

5. MVN
mvn をpom.xml ファイルがある場所で実行します。


$ mvn package

mvn を実行すると以下のような感じファイルがダウンロードされ、環境が構築されます。

[INFO] ------------------------------------------------------------------------
[INFO] Building embeddedTomcatSample Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefi
re-plugin/2.7.2/maven-surefire-plugin-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefir
e-plugin/2.7.2/maven-surefire-plugin-2.7.2.pom (10 KB at 8.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire/2.
7.2/surefire-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire/2.7
.2/surefire-2.7.2.pom (11 KB at 23.5 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefi
re-plugin/2.7.2/maven-surefire-plugin-2.7.2.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefir
e-plugin/2.7.2/maven-surefire-plugin-2.7.2.jar (29 KB at 33.1 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler-maven-
plugin/1.1.1/appassembler-maven-plugin-1.1.1.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler-maven-p
lugin/1.1.1/appassembler-maven-plugin-1.1.1.pom (8 KB at 18.6 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appass
embler/1.1.1/appassembler-1.1.1.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appasse
mbler/1.1.1/appassembler-1.1.1.pom (6 KB at 9.8 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/27/mojo
-parent-27.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/27/mojo-
parent-27.pom (27 KB at 56.4 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/codehaus-parent/3/codeha
us-parent-3.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/codehaus-parent/3/codehau
s-parent-3.pom (5 KB at 8.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler-maven-
plugin/1.1.1/appassembler-maven-plugin-1.1.1.jar
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler-maven-p
lugin/1.1.1/appassembler-maven-plugin-1.1.1.jar (762 KB at 408.6 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
core/7.0.22/tomcat-embed-core-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-c
ore/7.0.22/tomcat-embed-core-7.0.22.pom (2 KB at 3.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-l
ogging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.pom (2 KB at 2.1 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
jasper/7.0.22/tomcat-embed-jasper-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-j
asper/7.0.22/tomcat-embed-jasper-7.0.22.pom (2 KB at 2.2 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper/7.0.2
2/tomcat-jasper-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper/7.0.22
/tomcat-jasper-7.0.22.pom (3 KB at 4.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/
7.0.22/tomcat-servlet-api-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/7
.0.22/tomcat-servlet-api-7.0.22.pom (2 KB at 2.0 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-juli/7.0.22/
tomcat-juli-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-juli/7.0.22/t
omcat-juli-7.0.22.pom (2 KB at 2.4 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jsp-api/7.0.
22/tomcat-jsp-api-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jsp-api/7.0.2
2/tomcat-jsp-api-7.0.22.pom (2 KB at 3.1 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-el-api/7.0.2
2/tomcat-el-api-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-el-api/7.0.22
/tomcat-el-api-7.0.22.pom (2 KB at 2.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/3.7
/ecj-3.7.pom
Downloaded: http://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/3.7/
ecj-3.7.pom (2 KB at 2.6 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper-el/7.
0.22/tomcat-jasper-el-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper-el/7.0
.22/tomcat-jasper-el-7.0.22.pom (2 KB at 2.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-api/7.0.22/t
omcat-api-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-api/7.0.22/to
mcat-api-7.0.22.pom (2 KB at 2.7 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-util/7.0.22/
tomcat-util-7.0.22.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-util/7.0.22/t
omcat-util-7.0.22.pom (2 KB at 2.1 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
core/7.0.22/tomcat-embed-core-7.0.22.jar
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
jasper/7.0.22/tomcat-embed-jasper-7.0.22.jar
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/
7.0.22/tomcat-servlet-api-7.0.22.jar
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper/7.0.2
2/tomcat-jasper-7.0.22.jar
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-
logging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-c
ore/7.0.22/tomcat-embed-core-7.0.22.jar (2379 KB at 1313.5 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-juli/7.0.22/
tomcat-juli-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/7
.0.22/tomcat-servlet-api-7.0.22.jar (173 KB at 74.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-el-api/7.0.2
2/tomcat-el-api-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-l
ogging-juli/7.0.22/tomcat-embed-logging-juli-7.0.22.jar (38 KB at 14.5 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/3.7
/ecj-3.7.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-juli/7.0.22/t
omcat-juli-7.0.22.jar (38 KB at 36.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-api/7.0.22/t
omcat-api-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper/7.0.22
/tomcat-jasper-7.0.22.jar (577 KB at 150.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-util/7.0.22/
tomcat-util-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-el-api/7.0.22
/tomcat-el-api-7.0.22.jar (43 KB at 23.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper-el/7.
0.22/tomcat-jasper-el-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-j
asper/7.0.22/tomcat-embed-jasper-7.0.22.jar (768 KB at 178.0 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jsp-api/7.0.
22/tomcat-jsp-api-7.0.22.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-api/7.0.22/to
mcat-api-7.0.22.jar (7 KB at 3.7 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-util/7.0.22/t
omcat-util-7.0.22.jar (23 KB at 12.9 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jsp-api/7.0.2
2/tomcat-jsp-api-7.0.22.jar (87 KB at 49.8 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/apache/tomcat/tomcat-jasper-el/7.0
.22/tomcat-jasper-el-7.0.22.jar (120 KB at 54.6 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/3.7/
ecj-3.7.jar (1671 KB at 422.9 KB/sec)
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ embedded
TomcatSample ---
[WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i
.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\ewave\workspace\HEROKU\src\m
ain\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ embeddedTomca
tSample ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @
embeddedTomcatSample ---
[WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i
.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\ewave\workspace\HEROKU\src\t
est\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ embed
dedTomcatSample ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ embeddedTomcatSampl
e ---
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-bo
oter/2.7.2/surefire-booter-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-boo
ter/2.7.2/surefire-booter-2.7.2.pom (2 KB at 3.8 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-ap
i/2.7.2/surefire-api-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-api
/2.7.2/surefire-api-2.7.2.pom (2 KB at 4.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/maven-suref
ire-common/2.7.2/maven-surefire-common-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/maven-surefi
re-common/2.7.2/maven-surefire-common-2.7.2.pom (4 KB at 6.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-common-
artifact-filters/1.3/maven-common-artifact-filters-1.3.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-common-a
rtifact-filters/1.3/maven-common-artifact-filters-1.3.pom (4 KB at 5.4 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-bo
oter/2.7.2/surefire-booter-2.7.2.jar
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-ap
i/2.7.2/surefire-api-2.7.2.jar
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/maven-suref
ire-common/2.7.2/maven-surefire-common-2.7.2.jar
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-common-
artifact-filters/1.3/maven-common-artifact-filters-1.3.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-boo
ter/2.7.2/surefire-booter-2.7.2.jar (32 KB at 26.9 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/maven-surefi
re-common/2.7.2/maven-surefire-common-2.7.2.jar (60 KB at 38.5 KB/sec)
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-common-a
rtifact-filters/1.3/maven-common-artifact-filters-1.3.jar (31 KB at 16.8 KB/sec)

Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-api
/2.7.2/surefire-api-2.7.2.jar (119 KB at 57.5 KB/sec)
[INFO] No tests to run.
[INFO] Surefire report directory: C:\Users\ewave\workspace\HEROKU\target\surefir
e-reports
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-ju
nit3/2.7.2/surefire-junit3-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-jun
it3/2.7.2/surefire-junit3-2.7.2.pom (2 KB at 3.8 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-pr
oviders/2.7.2/surefire-providers-2.7.2.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-pro
viders/2.7.2/surefire-providers-2.7.2.pom (2 KB at 3.9 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-ju
nit3/2.7.2/surefire-junit3-2.7.2.jar
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-jun
it3/2.7.2/surefire-junit3-2.7.2.jar (26 KB at 54.2 KB/sec)

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ embeddedTomcatSample ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] Building jar: C:\Users\ewave\workspace\HEROKU\target\embeddedTomcatSample
.jar
[INFO]
[INFO] --- appassembler-maven-plugin:1.1.1:assemble (default) @ embeddedTomcatSa
mple ---
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appass
embler-model/1.1.1/appassembler-model-1.1.1.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appasse
mbler-model/1.1.1/appassembler-model-1.1.1.pom (4 KB at 7.5 KB/sec)
Downloading: http://repo1.maven.org/maven2/net/java/dev/stax-utils/stax-utils/20
060502/stax-utils-20060502.pom
Downloaded: http://repo1.maven.org/maven2/net/java/dev/stax-utils/stax-utils/200
60502/stax-utils-20060502.pom (565 B at 1.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/stax/stax/1.1.1-dev/stax-1.1.1-dev.po
m
Downloaded: http://repo1.maven.org/maven2/stax/stax/1.1.1-dev/stax-1.1.1-dev.pom
 (3 KB at 7.1 KB/sec)
Downloading: http://repo1.maven.org/maven2/junit/junit/3.8.2/junit-3.8.2.pom
Downloaded: http://repo1.maven.org/maven2/junit/junit/3.8.2/junit-3.8.2.pom (747
 B at 1.5 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appass
embler-model/1.1.1/appassembler-model-1.1.1.jar
Downloading: http://repo1.maven.org/maven2/net/java/dev/stax-utils/stax-utils/20
060502/stax-utils-20060502.jar
Downloading: http://repo1.maven.org/maven2/stax/stax/1.1.1-dev/stax-1.1.1-dev.ja
r
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/appassembler/appasse
mbler-model/1.1.1/appassembler-model-1.1.1.jar (24 KB at 21.4 KB/sec)
Downloaded: http://repo1.maven.org/maven2/stax/stax/1.1.1-dev/stax-1.1.1-dev.jar
 (166 KB at 69.4 KB/sec)
Downloaded: http://repo1.maven.org/maven2/net/java/dev/stax-utils/stax-utils/200
60502/stax-utils-20060502.jar (126 KB at 48.0 KB/sec)
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\embed\tomcat-e
mbed-core\7.0.22\tomcat-embed-core-7.0.22.jar to C:\Users\ewave\workspace\HEROKU
\target\repo\org\apache\tomcat\embed\tomcat-embed-core\7.0.22\tomcat-embed-core-
7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\embed\tomcat-e
mbed-logging-juli\7.0.22\tomcat-embed-logging-juli-7.0.22.jar to C:\Users\ewave\
workspace\HEROKU\target\repo\org\apache\tomcat\embed\tomcat-embed-logging-juli\7
.0.22\tomcat-embed-logging-juli-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\embed\tomcat-e
mbed-jasper\7.0.22\tomcat-embed-jasper-7.0.22.jar to C:\Users\ewave\workspace\HE
ROKU\target\repo\org\apache\tomcat\embed\tomcat-embed-jasper\7.0.22\tomcat-embed
-jasper-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-jasper\
7.0.22\tomcat-jasper-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo\o
rg\apache\tomcat\tomcat-jasper\7.0.22\tomcat-jasper-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-servlet
-api\7.0.22\tomcat-servlet-api-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\tar
get\repo\org\apache\tomcat\tomcat-servlet-api\7.0.22\tomcat-servlet-api-7.0.22.j
ar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-juli\7.
0.22\tomcat-juli-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo\org\a
pache\tomcat\tomcat-juli\7.0.22\tomcat-juli-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-el-api\
7.0.22\tomcat-el-api-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo\o
rg\apache\tomcat\tomcat-el-api\7.0.22\tomcat-el-api-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\eclipse\jdt\core\compiler\ec
j\3.7\ecj-3.7.jar to C:\Users\ewave\workspace\HEROKU\target\repo\org\eclipse\jdt
\core\compiler\ecj\3.7\ecj-3.7.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-api\7.0
.22\tomcat-api-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo\org\apa
che\tomcat\tomcat-api\7.0.22\tomcat-api-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-util\7.
0.22\tomcat-util-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo\org\a
pache\tomcat\tomcat-util\7.0.22\tomcat-util-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-jasper-
el\7.0.22\tomcat-jasper-el-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\
repo\org\apache\tomcat\tomcat-jasper-el\7.0.22\tomcat-jasper-el-7.0.22.jar
[INFO] Installing C:\Users\ewave\.m2\repository\org\apache\tomcat\tomcat-jsp-api
\7.0.22\tomcat-jsp-api-7.0.22.jar to C:\Users\ewave\workspace\HEROKU\target\repo
\org\apache\tomcat\tomcat-jsp-api\7.0.22\tomcat-jsp-api-7.0.22.jar
[INFO] Installing C:\Users\ewave\workspace\HEROKU\target\embeddedTomcatSample.ja
r to C:\Users\ewave\workspace\HEROKU\target\repo\com\heroku\sample\embeddedTomca
tSample\1.0-SNAPSHOT\embeddedTomcatSample-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.329s
[INFO] Finished at: Sat Dec 17 15:54:28 JST 2011
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS と表示されれば成功。

6. Launcher Class
TOMCATを起動させるためのJavaコードは以下の通りです。
このファイルを、C:\User\XXX\workspace\Heroku\src\main\java\launchディレクトリに置きます。


package launch;

import java.io.File;
import org.apache.catalina.startup.Tomcat;

public class Main {

public static void main(String[] args) throws Exception {

String webappDirLocation = “src/main/webapp/”;
Tomcat 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.
String webPort = System.getenv(“PORT”);
if(webPort == null || webPort.isEmpty()) {
webPort = “8080”;
}

tomcat.setPort(Integer.valueOf(webPort));

tomcat.addWebapp(“/”, new File(webappDirLocation).getAbsolutePath());
System.out.println(“configuring app with basedir: ” + new File(“./” + webappDirLocation).getAbsolutePath());

tomcat.start();
tomcat.getServer().await();
}
}

7.Servlet
Servletのコードは以下のとおり。
C:\User\XXX\workspace\Heroku\src\main\java\servlet\ディレクトリに置きます。


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 = “MyServlet”,
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();
}

}

8. JSP
JSPファイルを作ります。
C:\Users\XXX\workspace\Heroku\target\bin\src\main\webapp\ディレクトリにindex.jspファイルを置きます。


<html>
<body>
<h2>Hello Heroku!</h2>
</body>
</html>

9. MVNコマンド
JAVAコードをコンパイルなどするために再びMVNを実行します。


$ mvn package

10.TOMCATの起動
TOMCATを起動するためにバッチファイルを実行します。


$ target/bin/webapp.bat

ブラウザでServletをアクセスするには以下のURLを。

http://localhost:8080/hello

JSPをアクセスするには以下のURLです。

http://localhost:8080

Hello Heroku! とブラウザ画面に表示されます。

Servletでは、

hello heroku

とブラウザ画面に表示されればOKです。

11.Procfile

Procfileファイルを作成します。
このファイルの中身は、

web: sh target/bin/webapp

このファイルによってHEROKUでアプリがHEROKUにデプロイされます。

次は、このTOMCATをHEROKUへデプロイする手順です。

2011年8月29日

HTML Parser 評価 javax.swing.text.html.parser

Filed under: Framework,Java,Scala — admin @ 6:59 PM

HTML Parser 評価

HTMLパーサの主な用途は、クローラを書くときに使ったり、
HTML文書から文書だけを取り出すことでしょう。
あるいは、特定のタグの属性を見て何かするような目的もあります。

しかし、Web frameworkで使う目的は、タグの置換ですから、
オリジナルのHTMLにあって、パースした出力にはタグがなくなっている
ということはあってはなりません。

ここでのHTMLパーサの評価は、
オリジナルのHTMLファイルを読み込んで、
HTMLパーサによってパースした結果をHTMLファイルに戻す。
オリジナルと同じであることが評価されます。

すなわちオリジナルと出力したHTMLファイルの差異が評価ポイントとなります。

評価ポイント

評価ポイントは次のとおり。

  1. タグが未対応
  2. タグの欠落
  3. タグ要素の欠落
  4. タグが閉じていないケースの対応
  5. コメントの扱い
  6. Scriptコードの扱い
  7. XHTML化
  8. HTML5への対応
  9. 文字化け

HTMLパーサ評価用のソースコード

まずは、javax.swing.text.html.parserから。

  1. HTMLファイルの読み込みは、InputStreamReaderが使えるので、コードセットを指定することができる。
    文字化けの原因を回避。
  2. SAXのハンドラは独自。
    コメント用のハンドラがあるのでHTML内のコメントを出力できる。
    コメントを出力できないハンドラが多いなかこれは評価できる。
  3. タグへのパーサからの評価がタグ属性で出力される。
    最初にテストコードを動かしたときにオリジナルにない属性が出力されていたので
    出力しないようにコードを変更する。
  4. タグの出力は比較的素直。<BR>タグを<BR></BR>と出力しない。
package ews

import java.io._
import javax.servlet.http._
import javax.swing.text._
import javax.swing.text.html._
import javax.swing.text.html.parser._
/**
 * HtmlParse
 *
 * javax.swing.text.html should not be used.
 * Because it is not thread safe.
 */
class Htmlparse2Sp (request : HttpServletRequest, response : HttpServletResponse, htmlPath : String) extends TemplSp {
	var parsed:String = null	//
	override def toString :String = parsed
	// javax.swing.text.html.parser
	def html : String = {
		val htmlFile = new java.io.File(htmlPath)
		if(htmlFile.exists && htmlPath.toLowerCase.endsWith(".html")){
			var input:InputStreamReader = null
			try {
				input = new InputStreamReader (new FileInputStream(htmlFile), "UTF-8")	// open HTML file
				val cb = new ParserCallback2
				val pd = new ParserDelegator
				pd.parse(input, cb, true)
				parsed = cb.toString
				return parsed
			} catch {
			  case e:IOException => {
				  println("Exception "+e.getMessage)
			  }
			} finally {
				input.close
			}
		}
		null	// There is no file.
	}
}

ハンドラのソースコード

package ews
import javax.swing.text._
import javax.swing.text.html._

class ParserCallback2 extends HTMLEditorKit.ParserCallback {
	var buf = new StringBuffer
	override def toString :String = buf.toString

	override def handleStartTag(tag:HTML.Tag, attrs:MutableAttributeSet , pos:Int):Unit={
		var ok = true
		var buflocal = new StringBuffer
		buflocal.append("<"+tag.toString)
		val attrNames = attrs.getAttributeNames
		while (attrNames.hasMoreElements) {
			val attrName = attrNames.nextElement
			val attrValue = attrs.getAttribute(attrName)
			if(HTMLEditorKit.ParserCallback.IMPLIED.equals(attrName)){	// error
			  ok = false
			  println("ParserCallback2 [IMPLIED] tag=" + tag.toString + " attrName="+attrName + " attrValue="+attrValue)
			} else
			if(HTML.NULL_ATTRIBUTE_VALUE.equals(attrName)){
			  ok = false
			  println("ParserCallback2 [NULL_ATTRIBUTE_VALUE] tag=" + tag.toString + " attrName="+attrName + " attrValue="+attrValue)
			} else
			if(HTML.Attribute.ENDTAG.equals(attrName)){
			  ok = false
			  println("ParserCallback2 [ENDTAG] tag=" + tag.toString + " attrName="+attrName + " attrValue="+attrValue)
			}
			buflocal.append(" " + attrName + "=\"" + attrValue + "\"")
			if (attrName == StyleConstants.NameAttribute && tag == HTML.Tag.CONTENT) {

			}
		}
		buflocal.append(">")
		if(ok)
			buf.append(buflocal)
	}
	override def handleEndTag(tag:HTML.Tag, pos:Int):Unit={
		buf.append("</"+tag.toString+">\n")
	}
	override def handleSimpleTag(tag:HTML.Tag, attrs:MutableAttributeSet , pos:Int):Unit={
		handleStartTag(tag,attrs,pos)
	}
	override def handleText(ch:Array[Char],length:Int):Unit={
		buf.append(new String(ch))
	}
	override def handleComment(ch:Array[Char],length:Int):Unit={
		val str = new String(ch)
		if(str.trim.length > 0)
			buf.append("<!--\n"+str+"\n-->\n")
	}
	override def handleEndOfLineString(eol:String):Unit={
		buf.append(new String(eol))
	}
	def handleError(ln:Int, errorMsg:String):Unit={
		println("ERROR line number="+ln + " " + errorMsg)
	}
}

2010年12月23日

File write ファイル出力

Filed under: Java,Scala — admin @ 10:15 PM

ファイル出力

Scala のライブラリでファイル出力しようとAPIを探したらないのです。

scala.io.File のtoFile とうものを期待したのですが、そのままJavaのI/Oを使えということですね。

ということでファイル出力するコードを書いてみました。Javaそのものです。

このサンプルは、ファイルを書き出すことを試すために書いたのでBeanコードの生成は作りこんでいません。


package Hello
import scala.collection.mutable.ArrayBuffer
import java.io.{File,FileOutputStream,IOException,OutputStreamWriter}
object genBean {
	val GEN_SCALA_SOURCE_CHAR_CODE = "UTF-8"
	var bean_package = "bean"	// BEAN package
	var output_bean_dir = ""	// BEAN output path
	var SCHEMA = ""
	var className:String = ""

	private def outputSourceFile( filepath:String,src:ArrayBuffer[String]) :Boolean = {
		try {
			var fos = new FileOutputStream(filepath)
			var out = new OutputStreamWriter(fos,GEN_SCALA_SOURCE_CHAR_CODE)
			src.foreach(line => {
				out.write(line)
			})
			out.close
			true
		} catch {
			case e:IOException => {
				e.printStackTrace
				throw e
			}
		}
		false
	}
	private def isExistFile( filepath:String) :Boolean = 
	{
		val file = new File(filepath)
		file.exists
	}
	private def makeDir( schema:String) :Unit = {
		output_bean_dir = "./src/" + schema +"/"+ output_bean_dir +"/"	// BEAN output file path

		val objFile = new File(output_bean_dir)
	    if(objFile.exists() ){
		    if(!objFile.canWrite()){
				val eMessage = "Can not write the path "+output_bean_dir
				throw new Exception(eMessage);
		    }
	        return;
	    }
		var newfile = new File(output_bean_dir) // DIR
		if (!newfile.mkdirs()){
			val eMessage = "Can not make dir"
			throw new Exception(eMessage)
		}
	}

	var src = new ArrayBuffer[String]
	val T = "\t"
	val N = "\n"
	val DQ = "\"" 
	/**
	 * create soruce code
	 */
	def code :Unit = {
		src.append("import scala.reflect.{BeanProperty,BeanInfo}"+N+N)
		src.append("@BeanInfo"+N)
		src.append("class "+ className + "{"+N)
		src.append(T+"@BeanProperty var RENTALODRID:BigDecimal=null"+N)
		src.append(T+"@BeanProperty var CUSTOMERID:Integer=null"+N)
		src.append(T+"@BeanProperty var SALESPRICE:BigDecimal=null"+N)
		src.append(T+"@BeanProperty var OTHER:String=null"+N)
		src.append("}"+N)
	}
	def genClass(schema:String,_className:String) :Boolean = {
		className = _className
		SCHEMA = schema
		bean_package = SCHEMA + "." + bean_package	// BEAN package
		makeDir(SCHEMA)
		code
		val file = "./" + output_bean_dir + "/" +className+".scala"
		outputSourceFile(file,src)
	}
	def main(args : Array[String]) : Unit = {
		genClass("SCOTT","DEPT")
	}
}

このプログラムを実行すると以下のファイルが書き出されます。


import scala.reflect.{BeanProperty,BeanInfo}

@BeanInfo
class DEPT{
	@BeanProperty var RENTALODRID:BigDecimal=null
	@BeanProperty var CUSTOMERID:Integer=null
	@BeanProperty var SALESPRICE:BigDecimal=null
	@BeanProperty var OTHER:String=null
}

2010年11月26日

JavaからScalaへの書き換え ?演算子

Filed under: Java,Scala — admin @ 12:16 PM

ServletやJSPでURLからパラメータを受け取るgetParameter を使うときによく書くコードはこのような書き方です。

これをScalaでどうやって書けばいいか悩んでしまいました。

String name =
 request.getParameter("name") != null ?request.getParameter("name"):"";

boolean desc = 
request.getParameter("desc")!= null && "1".equals(request.getParameter("desc"))? true:false;

そうだScalaは関数型ってことは、ifも当然関数!
確かめてみよう。

object Enzan {
  def main(args : Array[String]) : Unit = {
	  var i = 1
	  print(if(i != 1){"HelloWorld"}else{"Yihee!!"})
  }
}

このコードの結果は、「Yihee!!」です。

ということは、

var name = 
if(request.getParameter("name") != null){
 request.getParameter("name")
} else {
 ""
}

var desc = 
if(request.getParameter("desc")!= null
 && "1".equals(request.getParameter("desc")){
  true
} else {
 false
}

となる訳です。

2010年11月19日

ScalaでDBフレームワークによるDB操作ができた

Filed under: Java,Scala — admin @ 8:40 PM

Javaで自作したデータベース・フレームワークでDB操作することができた。

OracleにあやかってSqlPlusクラス。

SELECT文は、val results1 = db.select(“*”).from(“EMP”).executeQuery

executeQueryメソッドを呼ぶと、関数の返り値がArrayListで複数レコードを返します。

import scala.collection.JavaConversions._ によって Java のコレクションクラスをScalaのfor構文で使えるようになります。

1レコード分は、Array[Object] なので asInstanceOf でキャストします。カラムもfor構文で出力。

このフレームワークの特徴はBeanクラスが使えること。

Scalaで定義したSeeDo.Employeeクラスを引数に渡したところ、Java用に作ったのでScalaのStringクラスなど引数を取るsetterがないと言われてしまいます。

package SeeDo
import seedo.database._
import scala.collection.JavaConversions._

object sqlplus {
  def main(args : Array[String]) : Unit = {
	  val db = new SqlPlus
	  // Array
	  val results1 = db.select("*").from("EMP").executeQuery
	  for(i <- results1){
	 	  var record = i.asInstanceOf[Array[Object]]
	 	  for(j <- record){
	 		  print(j+" ")
	 	  }
	 	  println
	  }
	  // Bean class
	  val results = db.select("*").from("EMP").executeQuery(Class.forName("SeeDo.Employee"))
	  for(i <- results){
	 	  println(i)
	  }
	  db.close
  }
}




このフレームワークにデータベースの接続用の記述がないのはプロパティファイルから定義を読み込むことができるため。

TOMCAT環境下で実行するなら、ContextからDataSourceをLookupしてコネクションプールから接続します。

以下のようにSqlPlusのコンストラクタに書くこともできます。

  val db = new SqlPlus( "oracle.jdbc.driver.OracleDriver"
      ,"jdbc:oracle:thin:@192.168.0.105:1521:ORCL"
      ,"scott"
      ,"tiger" )

実行するとこのようになります。

最初のforループは、EMP表のレコードを取ってきています。

Javaなので、値がnullだとnullと表示。

次のforループは、executeQuery(Class.forName(“SeeDo.Employee”))で引数にBeanクラスを指定して、レコードのデータをBeanクラスに格納して返します。

フレームワークのなかで引数で渡したBeanクラスのオブジェクトが生成されます。
printlnでArrayListの要素を出力すると、SeeDo.Employeeクラスで定義した toStrin 関数が呼び出されています。

しかし、setterがないので値が初期値になっています。

7369 SMITH CLERK 7902 1980-12-17 00:00:00.0 800 null 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.0 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00.0 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00.0 2975 null 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.0 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.0 2850 null 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00.0 2450 null 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00.0 3000 null 20
7839 KING PRESIDENT null 1981-11-17 00:00:00.0 5000 null 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.0 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00.0 1100 null 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00.0 950 null 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00.0 3000 null 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00.0 1300 null 10
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning null
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setENAME(java.lang.String)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setSAL(java.math.BigDecimal)がメソッドがありません。
Warning SeeDo.Employeeクラスには、setCOMM(null)がメソッドがありません。
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]
[Employee empno:0,ename:null,job:null,mgr:0,hiredate:null,deptno:0,varsal:0]



2010年11月16日

SortedHashtable のScala化

Filed under: Java — admin @ 8:10 PM

プログラムを書いていて、ハッシュテーブルの要素のソート(並べ替え)を行ってから要素を順に処理する必要がありました。

JavaのHashtableクラスは、ハッシュテーブルに格納した要素の順序は保持されません。まずは、JavaでSortedHashtableクラスを作ってみました。

import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

public class SortedHashtable extends Hashtable {
	public SortedHashtable(int initialCapacity, float loadFactor) {
		 super(initialCapacity, loadFactor);
	}
	public SortedHashtable(int initialCapacity) {
		super(initialCapacity);
	}
	public SortedHashtable() {
		super();
	}
	public Enumeration keys() {
	    Vector v = new Vector(super.keySet());
	    Collections.sort(v);
	    return v.elements();
	}
	public Set keySet()	{
		TreeSet s = new TreeSet(super.keySet());
		return s;
	}
	public Enumeration elements() {
		Enumeration e = super.elements();
	    Vector v = new Vector();
	    while (e.hasMoreElements()){
		      v.add(e.nextElement());
	    }
	    Collections.sort(v);
	    return v.elements();
	}
}




Javaのプログラムなので、SortedHashtableクラスはこれでいいのですが、これをScalaでクラス化したくなります。

Javaクラスを継承して、Scalaクラスで作ってみようと以下のコードを書いてみたのですが、

package Hello
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

class SortedHashtable[A,B](initialCapacity :Int, loadFactor:Float) 
                                         extends java.util.Hashtable(initialCapacity, loadFactor) {
	def this() = this(11,0.75F)
	def this(initialCapacity: Int) = this(initialCapacity,0.75F)

	override def keys = {
	    var v = new Vector(super.keySet());
	    Collections.sort(v)
	    v.elements()
	}
	override def keySet = new TreeSet(super.keySet());

	override def elements = {
	    var e = super.elements();
	    var v = new Vector();
	    while (e.hasMoreElements()){
		      v.add(e.nextElement())
	    }
	    Collections.sort(v)
	    v.elements()
	}
	override def remove(key) = super.remove(key)
	override def put(key:A,value:B) = super.put(key,value)
}


putのところで、Javaのput(key,values)の引数がNothing でないとダメだといってコンパイルできません。

次のように書けばコンパイルはできるのですが、

         override def put(key,value) = super.put(key,value)
        var h = new SortedHashtable[String,String]
        h.put("123","abc") 


と書くと引数はNothingじゃないとダメとなります。

となると、override を外して、CASTするしかないかということで、以下のようにコードを修正します。

def put(key:A,value:B) = super.put(key.asInstanceOf[Nothing],value.asInstanceOf[Nothing])

これでコンパイルは通るのですが、今度は実行時エラー。確かにNothingですから。

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to scala.runtime.Nothing$
	at Hello.SortedHashtable.put(SortedHashtable.scala:30)
	at Hello.testS0rtedHashtable$.main(testS0rtedHashtable.scala:6)
	at Hello.testS0rtedHashtable.main(testS0rtedHashtable.scala)


Nothing にはキャストできないといわれても。Anyになるといいのですが。

まだまだ勉強中です。

Powered by WordPress