2014年6月18日水曜日

MavenでWebアプリをモダンに開発

前回、maven+testngでモダンにテスト開発をしてみました
今回はmavenを使ってサーバサイドだけでWebアプリ開発ができないか頑張ってみました

■環境
CentOS release 5.10 (Final)
JDK 1.7.0_05
Maven 3.1.1
Tomcat 7.0.27
Servlet API 3.0.1

■プロジェクトの作成
mvn archetype:generate -DgroupId=com.sample.webapp -DartifactId=webapp-quick-start -DarchetypeArtifactId=maven-archetype-webapp

※versionとGroupIdの入力は特に指定しませんでした
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Using property: groupId = com.sample.webapp
[INFO] Using property: artifactId = webapp-quick-start
Define value for property 'version':  1.0-SNAPSHOT: :
[INFO] Using property: package = com.sample.webapp
Confirm properties configuration:
groupId: com.sample.webapp
artifactId: webapp-quick-start
version: 1.0-SNAPSHOT
package: com.sample.webapp
 Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.sample.webapp
[INFO] Parameter: packageName, Value: com.sample.webapp
[INFO] Parameter: package, Value: com.sample.webapp
[INFO] Parameter: artifactId, Value: webapp-quick-start
[INFO] Parameter: basedir, Value: /var/tmp/maven
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /var/tmp/maven/webapp-quick-start
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.472s
[INFO] Finished at: Tue Jun 17 19:53:57 JST 2014
[INFO] Final Memory: 12M/30M
[INFO] ------------------------------------------------------------------------

webapp-quick-start というフォルダが作成されていることを確認します
ついでにパッケージ用のディレクトリも作成します

ls -ltr webapp-quick-start/
合計 8
drwxr-xr-x 3 root root 4096  6月 17 19:53 src
-rw-r--r-- 1 root root  746  6月 17 19:53 pom.xml

mkdir -p webapp-quick-start/src/main/java/com/sample/webapp

■サンプルアプリ作成
dependencies 内にservlet-apiを使うためのライブラリの定義を記載します

emacs webapp-quick-start/pom.xml
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>compile</scope>
</dependency>

メインとなるクラスを作成します

emacs webapp-quick-start/src/main/java/com/sample/webapp/TestWebApp.java
package com.sample.webapp;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestWebApp extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println( "Hello World!!!" );
        out.flush();
        out.close();
    }
}

Webコンテナの定義を記載します

emacs webapp-quick-start/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>TestWebApp</servlet-name>
    <servlet-class>com.sample.webapp.TestWebApp</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestWebApp</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

■ビルド
cd webapp-quick-start
mvn clean compile package

■デプロイ
cp target/webapp-quick-start.war /usr/local/tomcat/webapps/
service tomcat restart

tomcatのデプロイ先のディレクトリは各自の環境に合わせてください
tomcatの再起動コマンドも各自の環境に合わせてください
再起動はtomcatのオートデプロイがONになっていれば再起動不要です

■動作確認
http://localhost:8080/webapp-quick-start/hello

にアクセスして「Hello World!!!」が表示されることを確認してください
Tomcat ManagerにアクセスするとデプロイしたWebコンテナ情報が登録されていることもわかるかと思います


何とかサーバサイドだけで開発できる環境ができました
Javaを書き換えたり、pom.xmlを書き換えたりした場合は
「mvn clean compile package」->「cpでデプロイ」の流れを実施すれば変更を確認することができます

以下、やったみた感想です
  • MavenのXMLを記述するところがJavaらしいとというか、RubyやPHPみたいにモダン開発できない(慣れればできる?)
  • HelloWorldのサンプルを作成するだけなのにコード量が多すぎるのが残念
  • scaffold的な感じをJavaでもやりたかったのが動機
  • 今回は通常のWebアプリ(サーブレットコンテナ)でのやり方でだったが spring.io や PlayFramework を使えばもっと簡単にできるはず

■参考サイト

■Tips
http://localhost:8080/webapp-quick-start/
にアクセスするとsrc/main/webapp/index.jspの情報が表示されます

web.xmlのurl-mappingに「/」のみ記載するとwebapp-quick-start/aaa, webapp-quick-start/bbbと/配下の何にアクセスしてもサンプルの内容が表示されます

どうしてもEclipseで開発したい場合は「maven eclipse:eclipse」するとEclipseにインポートできるようになります

0 件のコメント:

コメントを投稿