heroku(java編)

前回でruby@herokuできるようになったので次のjavaに進む。

環境はcygwin上でmavenを使う - 三次元日誌参照。

以降の手順

http://devcenter.heroku.com/articles/java
ベース

heroku login

$ heroku login
Enter your Heroku credentials.
Email: ousttrue@gmail.com
Password:

rubyのときと同じ

プロジェクト作成

せっかくなのでmavenを使う

$ mvn archetype:create -DgroupId=heroku -DartifactId=sample
$ cd sample/
$ find .
.
./pom.xml
./src
./src/main
./src/main/java
./src/main/java/heroku
./src/main/java/heroku/App.java
./src/test
./src/test/java
./src/test/java/heroku
./src/test/java/heroku/AppTest.java

とりあえずビルド、実行してみる

$ mvn compile
$ java -classpath target/classes heroku.App
Hello World!

Herokuサンプル化する

とりあえずクリア

$ mvn clean
$ rm -rf src/main/java/heroku
$ rm -rf src/test/java/heroku

src/main/java/HelloWorld.java

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.*;

public class HelloWorld extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().print("Hello from Java!\n");
    }

    public static void main(String[] args) throws Exception{
        Server server = new Server(Integer.valueOf(System.getenv("PORT")));
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);
        context.addServlet(new ServletHolder(new HelloWorld()),"/*");
        server.start();
        server.join();   
    }
}

pom.xml

<?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.example</groupId>
    <version>1.0-SNAPSHOT</version>
    <artifactId>helloworld</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>7.4.5.v20110725</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>1.1.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>assemble</goal></goals>
                        <configuration>
                            <assembleDirectory>target</assembleDirectory>
                            <programs>
                                <program>
                                    <mainClass>HelloWorld</mainClass>
                                    <name>webapp</name>
                                </program>
                            </programs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

build

$ mvn install

実行してみる。

$ PORT=8080 ./target/bin/webapp

asseblerプラグインでtarget/bin/webappが出力されている。
実行するのには環境変数PORTが必要(HelloWorld.java:16)。

http://localhost:8080
にアクセスしてみる。

C-c
で停止

foremanで実行する

Procfile

web: sh target/bin/webapp
||

>|sh|
$ foreman start
20:43:37 web.1     | started with pid 9016
20:43:38 web.1     | 2011-11-27 20:43:38.427:INFO::jetty-7.4.5.v20110725
20:43:38 web.1     | 2011-11-27 20:43:38.473:INFO::started o.e.j.s.ServletContextHandler{/,null}
20:43:38 web.1     | 2011-11-27 20:43:38.512:INFO::Started SelectChannelConnector@0.0.0.0:5000 STARTING

http://localhost:5000
にアクセスしてみる。
今度はport5000だった。

C-C
で停止。

gitに登録

.gitignore

$ echo target > .gitignore
$ git init
$ git add .
$ git commit -m "init"

herokuアプリ作成

$ heroku create --stack cedar

herokuにアップ

$ git push heroku master

ブラウザで開く

$ heroku open

以上で、heroku java編終わり。
ローカルのforemanで動作確認するところを押さえれば問題ないようだ。