JavaによるWebアプリケーション開発



 Javaの開発実行環境の構築については、Java開発実行環境の構築を参照してください。
 Tomcatのインストールについては、Tomcatの設定(on Fedora)を参照してください。

●サーブレット(Servlet)/JSP入門

 サーバ側で動作するJavaアプリケーションを作成するにはサーブレットやJSPを使います。サーブレットとJSPは基本的に同じことを行いますが、サーブレットはJavaプログラムと同様に作成するのに対し、JSPはPHPのようにスクリプト言語のような記述します。そこで画面表示部分の作成にはJSPが適しており、データベースとの接続などバックエンドで動く部分はサーブレットで作成するのが適しています。
 なお、サーブレットやJSPはサーバ側でJavaアプリケーションを作成するための仕様であり、実装したアプリケーションとして無料で提供されているTomcatを使用します。TomcatはWebサーバとしての機能も持っておりTomacat単体で試していきますが、Apacheなどと組み合わせる場合は『Tomcatとの連携(mod_proxy_ajp)』を参照して下さい。
 Tomcatの設定(on Fedora)を参照して、Tomcatをインストールします。
 2009年2月現在、Tomcatの最新バージョンは6.0.18です。6.0を動作させるにはJava2 SE 5.0(JDK1.5.0)以上が必要です。JDKもあわせてインストールしてください。
 Tomcat6.0.18はServlet2.5/SP2.1の仕様に準拠しています。Servlet/JSPのAPI仕様書はCoreパッケージをダウンロードした場合はダウンロードしたファイルに含まれていますので確認しておきましょう。
 Webブラウザに「/usr/local/tomcat/webapps/doc/index.html」と入力するか、「http://localhost:8080/docs」と入力すると確認できます。ページ中段に「Reference」と書かれたブロックがあり、その中に「Servlet API Javadocs」と「JSP API Javadocs」と書かれたリンクがあります。

●Tomcatのディレクトリ構成

 yumコマンドを使用してインストールした場合のディレクトリ構成は下記のようになります。tar形式からインストールした場合も、ほぼ同様です。

ディレクトリ名 説明
bin Tomcatの起動や停止に使うスクリプトが入っています。
common このクラスに入っているものはすべてのWebアプリケーションからアクセス可能です。サブディレクトリのclassesには展開済みのクラスが、libディレクトリにはJARファイルが入ります。servlet-api.jarやjsp-api.jarもここに入っています。
Tomcat6.0から、当ディレクトリはなくなり「lib」ディレクトリに統合されています。
conf 各種設定ファイル(サーバ設定ファイル、ユーザリストなど)が入っています。
lib Tomcat6.0からcommon、shared、serverディレクトリがlibディレクトリに統合されました。conf/catalina.propertiesファイルを編集すれば、これらのディレクトリ構成を変更することができます。
logs サーバに対して出されたリクエストのログ、標準出力、標準エラーメッセ−ジのログ、Tomcat同梱のサンプルアプリケーションのログファイルもここに格納されます。
server Catalina(サーブレットAPIの実装エンジン)だけが使用できるクラスがサブディレクトリのclassesとlibに入っています。これにはCGIや正規表現をサポートするためのライブラリや、Webサーバとの連携用のコネクタなどが含まれます。
Tomcat6.0から、当ディレクトリはなくなり「lib」ディレクトリに統合されています。
shared Webアプリケーションからアクセスできるクラスが入ります。commonと違い、Catalinaはアクセスできません。
Tomcat6.0から、当ディレクトリはなくなり「lib」ディレクトリに統合されています。
temp 一時的なファイルの保存先です。
webapps Webアプリケーションを配置するデフォルトのディレクトリです。Tomcatのサンプルアプリケーションなどもここに入っています。
work 一時ファイル、プリコンパイルされたJSPページ、その他の中間ファイルが入ります。

Tomcatの設定ファイル

 Tomcatの設定はconfディレクトリにあるxmlファイルを編集して行います。デフォルトでは4つのxmlファイルがあり、それぞれの設定内容は以下のようになっています。
 「server.xml」はTomcatサーバの動作を定義する設定ファイルです。Tomcatに関する主要な設定はこのファイルで行います。Tomcatの使用ポートやWebアプリケーションのための宣言などもここに記述されています。server.xmlは$CATALINA_HOME/confディレクトリにあります。
 環境変数CATALINA_HOMEの設定方法はこちらを参照してください。
 「server-minimal.xml」は独自のserver.xmlを作成するためのテンプレートです。コメントなどが削除されており、必要最小限の情報しか記載されていません。サーバの設定をカスタマイズする場合は、このファイルを編集してserver.xmlという名前に変更するのがもっとも簡単な方法です。
 「tomcat-users.xml」はユーザとパスワード、およびその権限情報を記述します。
 「web.xml」はデフォルトの配備記述子(deployment descriptor)ファイルです。Tomcatで実行されているすべてのアプリケーションから参照されます。すべてのアプリケーションに適用できるサーブレットの基本定義とMIMEマッピングを記述しています。独自のweb.xmlを持っていないWebアプリケーションのための配備記述子としても使われます。web.xmlにはサーブレット定義、セッション定義、認証設定、ウェルカム・エラーページ設定などWebアプリケーションの動作を規定する設定を行います。
 Tomcatではweb.xmlは$CATALINA_HOME/confディレクトリ、または各コンテキストディレクトリ/WEB-INFディレクトリに設置します。$CATALINA_HOME/confディレクトリ配下のweb.xmlはデフォルトで用意されており、すべてのコンテキスト(Webアプリケーション)に適用されます。各コンテキストディレクトリ/WEB-INFディレクトリ配下のweb.xmlは各コンテキストごとの動作に適用されます。

Webアプリケーションのアーキテクチャ

 Webアプリケーションはhtmlや画像ファイル、JSPファイル、Javaクラスファイル、設定ファイルなど複数のファイルの集合です。サーブレットの仕様には、これらのファイルを格納する標準のディレクトリ構成が定義されています。Webアプリケーションの標準の構成は次のように定められています。

java-kaihatsu01.png

 相対パス「/」は、Webアプリケーションのルートディレクトリです。パブリックにアクセス可能なファイルはすべてこのディレクトリに置かれます(HTML、JSP、GIFファイルなど)。
 「/WEB-INF」は、パブリックにアクセスできないファイルが置かれます(web.xmlなど)。
 「/WEB-INF/classes」にはWebアプリケーションのクラスファイルがすべてここに置かれます。
 「/WEB-INF/lib」はクラスファイルをJAR形式でアーカイブしたファイルを置くことができます。
 サーブレットの仕様によれば、Webアプリケーションは配備記述子と呼ばれるファイルを持っていなければなりません。このファイルはWebアプリケーションのWEB-INFディレクトリに置かれます。web.xmlにはWebアプリケーションの設定オプションが記述されます。

●プログラムの準備

 まずは、サーブレットでHelloWorld_servletプログラムを作成します。
# vi HelloWorld_servlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld_servlet extends HttpServlet{
   public void service(HttpServletRequest request,
            HttpServletResponse response)
throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}
 サーブレットのjavaソースファイルは通常行うように
javac HelloWorld_servlet.java
 としても下記のようにエラーとなりコンパイルできません。
HelloWorld_servlet.java:4: パッケージ javax.servlet は存在しません。
import javax.servlet.ServletException;
    ^
HelloWorld_servlet.java:5: パッケージ javax.servlet.http は存在しません。
import javax.servlet.http.HttpServlet;
         ^
HelloWorld_servlet.java:6: パッケージ javax.servlet.http は存在しません。
import javax.servlet.http.HttpServletRequest;
         ^
HelloWorld_servlet.java:7: パッケージ javax.servlet.http は存在しません。
import javax.servlet.http.HttpServletResponse;
         ^
HelloWorld_servlet.java:9: シンボルを見つけられません。
シンボル: クラス HttpServlet
public class HelloWorld extends HttpServlet{
^
HelloWorld_servlet.java:11: シンボルを見つけられません。
シンボル: クラス HttpServletRequest
場所    : HelloWorld の クラス
   public void service(HttpServletRequest request,
       ^
HelloWorld_servlet.java:12: シンボルを見つけられません。
シンボル: クラス HttpServletResponse
場所    : HelloWorld の クラス
            HttpServletResponse response)
            ^
HelloWorld_servlet.java:13: シンボルを見つけられません。
シンボル: クラス ServletException
場所    : HelloWorld の クラス
throws ServletException, IOException {
       ^
エラー 9 個
 上記のようなエラーが発生するのは、サーブレットAPIのクラスパスの設定がされていないためです。サーブレットのコンパイルを行うにはサーブレットAPIをクラスパスに追加する必要があります。
 サーブレットAPIのクラスパスは、サーブレットをtar形式またはrpm形式のどちらの方法でインストールしたかによって異なります。
 rpm形式では、「tomcat5-servlet-2.4-api-5.5.27-6.1.fc10.noarch」というようにサーブレットのAPIがインストールされます。
Tomcat5系の場合
# rpm -ql tomcat5-servlet-2.4-api-5.5.27-6.1.fc10.noarch ← サーブレットAPIのリスト一覧表示
/usr/share/doc/tomcat5-servlet-2.4-api-5.5.27
/usr/share/doc/tomcat5-servlet-2.4-api-5.5.27/LICENSE
/usr/share/java/servletapi5.jar
/usr/share/java/tomcat5-servlet-2.4-api-5.5.27.jar
/usr/share/java/tomcat5-servlet-2.4-api.jar
/usr/share/maven2/poms/JPP-tomcat5-servlet-2.4-api.pom
Tomcat6系の場合
# rpm -ql tomcat6-servlet-2.5-api-6.0.32-5.fc15.noarch
/etc/maven/fragments/tomcat6-servlet-api
/usr/share/java/tomcat6-servlet-2.5-api.jar
/usr/share/java/tomcat6-servlet-api.jar
/usr/share/maven2/poms/JPP-tomcat6-servlet-api.pom
 Tomca5系について説明しますが、上記のうちの、「・・・/servletapi5.jar」、「・・・/tomcat5-servlet-2.4-api-5.5.27.jar」、「・・・/tomcat5-servlet-2.4-api.jar」のいずれかをクラスパスに指定します。
 環境変数CATALINA_HOMEにTomcatのインストールディレクトリが設定されていれば以下のコマンドでクラスパスを追加できます。

Linuxの場合

・tarからサーブレットをインストールした場合

# vi /etc/profile ← 環境変数を編集
##### サーブレットAPIのクラスパス環境設定 #####
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/・・・/servlet-api.jar ← サーバ環境に合わせる
# source /etc/profile ← 環境変数を反映

・rpmからサーブレットをインストールした場合

# vi /etc/profile ← 環境変数を編集
##### サーブレットAPIのクラスパス環境設定 #####
export CLASSPATH=$CLASSPATH:/usr/share/java/servletapi5.jar ← サーバ環境に合わせる
# source /etc/profile ← 環境変数を反映

 ただし、サーブレットAPIのクラスパスを設定後も環境によっては下記のようなエラーが発生します。
 CentOS5.6の環境(tomcat5-5.5.23-0jpp.17.el5_6、tomcat5-servlet-2.4-api-5.5.23-0jpp.17.el5_6)でコンパイルすると下記のようなエラーが表示されます。
 なお、Fedora14の環境(tomcat6-6.0.26-16.fc14.noarch、tomcat6-servlet-2.5-api-6.0.26-16.fc14.noarch)では、そのままで問題なく動作します。
The serializable class HelloWorld does not declare
           a static final serialVersionUID field of type long
 このため、public class ***** extends HttpServlet { のすぐ下に、
private static final long serialVersionUID = 1L;
を追加後、再コンパイルしてください。

●Webアプリケーションディレクトリの作成

 次に、Webアプリケーション標準のディレクトリ構成を作成します。
 まず、Webアプリケーションのhelloworldディレクトリを、$CATALINA_HOME/webappsディレクトリに作成します。
 helloworldディレクトリにWEB-INFディレクトリを作成してください。作成したWEB-INFディレクトリにclassesとlibディレクトリを作成します。作成したclassesディレクトリにコンパイル済のHelloWorld_servlet.classをコピーしてください。
# mkdir $CATALINA_HOME/webapps/helloworld ← helloworldディレクトリ作成
 ↑ これがhelloworldのドキュメントルート(ルートディレクトリ)になります
# mkdir $CATALINA_HOME/webapps/helloworld/WEB-INF ← WEB-INFディレクトリ作成
# mkdir $CATALINA_HOME/webapps/helloworld/WEB-INF/classes ← classesディレクトリ作成
# mkdir $CATALINA_HOME/webapps/helloworld/WEB-INF/lib ← libディレクトリ作成
# cp HelloWorld_servlet.class $CATALINA_HOME/webapps/helloworld/WEB-INF/classes
 ↑ classファイルのコピー

●配備記述子(web.xml)の作成(root権限)

 WEB-INFディレクトリにweb.xmlファイルを作成し、サーブレットマッピングを記述します。サーブレットマッピングにより、特定のURLとサーブレットクラスが結び付けられます。サーブレットマッピングはweb.xmlの<web-apps></web-apps>要素の間に記述します
# vi $CATALINA_HOME/webapps/helloworld/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>
    display Hello World
  </description>
  <display-name>HelloWorld Examples</display-name>
  <servlet>
    <servlet-name>
      hello
    </servlet-name>
    <servlet-class>
      HelloWorld_servlet ← 先ほど作成した「HelloWorld_servlet.java」に
    </servlet-class>     宣言されているclass名を記載する。
  </servlet>         public class HelloWorld_servlet extends・・・
  <servlet-mapping>
    <servlet-name>
      hello
    </servlet-name>
    <url-pattern>
      /hello/
    </url-pattern>
  </servlet-mapping>
</web-app>
 以上でWebアプリケーションの標準構成ができあがりました。
 なお、web.xmlを追加・編集した場合、Tomcatが自動的に検知して新しい設定を反映してくれるためTomcatの再起動は必要ありません。この機能は「ホットデプロイ」と言われます。

●WebアプリケーションをWarにまとめる

 WebアプリケーションはWarという1つのファイルにまとめることができます。WarファイルをWebアプリケーションのルートに配置するだけでWebアプリケーションの追加が行えるため、配布が容易になります。
 Warファイルを作成するにはコマンドラインから、Webアプリケーションのディレクトリに移動し、「jar cvf helloworld_servlet.war ./*」を実行します。処理が完了すると同じディレクトリにhelloworld.warというファイルが作成されています。

●Webアプリケーションの配備

 早速、作成したWebアプリケーションをTomcatに配備します。
 ただし、「$CATALINA_HOME/webapps」に必要ディレクトリ等を作成しつつ、作業した場合は下記のコピー作業は不必要です。
 TomcatのデフォルトのWebアプリケーション配備場所は「$CATALINA_HOME/webapps」です。作成したhelloworldディレクトリをwebappsディレクトリにコピーするだけで、Webアプリケーションの配備は完了です。warファイルを作成した場合も、webappsディレクトリにhelloworld.warを配置することで、Webアプリケーションの配備ができます。
 Tomcatの標準設定では「$CATALINA_HOME/webapps」をベースディレクトリ(appBase)として認識しますので、上記(Webアプリケーションディレクトリの作成)のように配備した場合はコンテキストファイルは不要となります。
 ただし、「$CATALINA_HOME/webapps」以下に作成したディレクトリ名とコンテキストファイルを作成するで説明するコンテキストファイルの「path」名が同じ場合、Tomcat Web アプリケーションマネージャの表示では、前者が優先します。
 Webアプリケーションの配備が完了したら(上記web.xmlの記載方法では)「http://localhost:8080/helloworld/hello/」にアクセスすると、HelloWorldアプリケーションが実行されます。
  • 注意
  •  上記「web.xml」の<url-pattern></url-pattern>において、「/hello/」となっている場合は「http://localhost:8080/helloworld/hello/」でアクセスすることになり、「/hello(/無しの場合)」となっている場合は「http://localhost:8080/helloworld/hello(/無し)」でアクセスすることなります。
  •  classファイルを変更した場合は、Tomcatを再起動する必要があります。もしくは、Tomcat Managerから該当アプリケーションを再起動する方法でも構いません。
  •  ただし、server.xmlを書き換えることにより、特定アプリケーションのclassを書き換えても自動的に再読み込みするように設定することも可能です。
  •  <servlet-name></servlet-name>に設定されている名称が、他のアプリケーションでダブって設定されている場合、正常に配備することができず該当するWebアプリケーション全体が停止します。
  •  <url-pattern></url-pattern>で同じ名前が使用されている場合、後部に記載されているサーブレットが実行されます。

●root以外のユーザが使うには

 これまでの設定ではjspファイル、javaファイルやclassファイルを必ず$CATALINA_HOME/webappsディレクトリ(Webアプリケーションルートディレクトリ)以下に置かなければならなりませんでした。
 しかし、このディレクトリはroot(またはtomcat)しか書き込み権限がありません。他のユーザが作成したサーブレット及びJSPを実行できるようにさせるためには、$CATALINA_HOME/webappsディレクトリ以下に該当ユーザのみがアクセス可能なユーザ用のディレクトリを作成します。

 下記は、「WEB-INF」ディレクトリ、「classes」ディレクトリ、「lib」ディレクトリ等をroot権限で作成する場合です。
# mkdir $CATALINA_HOME/webapps/test ← testディレクトリ作成
# mkdir $CATALINA_HOME/webapps/test/WEB-INF ← WEB-INFディレクトリ作成
# mkdir $CATALINA_HOME/webapps/test/WEB-INF/classes ← classesディレクトリ作成
# mkdir $CATALINA_HOME/webapps/test/WEB-INF/lib ← libディレクトリ作成
# chown -R test:test $CATALINA_HOME/webapps/test ← 所有者の変更
 「test」ディレクトリを含め、root権限でディレクトリ及びファイルを作成した場合のアクセス権は、「drwxr-xr-x」及び「-rw-r--r--」となります。

 ユーザが配備方法について詳しいのであれば、「$CATALINA_HOME/webapps/test」以下のディレクトリ等はユーザに作成させても問題ありません。WEB-INFディレクトリにユーザが適切なweb.xmlを作成すれば、Webブラウザからアクセスできるようになります。
 下記は、「WEB-INF」ディレクトリ、「classes」ディレクトリ、「lib」ディレクトリ等をユーザ権限で作成する場合です。
# mkdir $CATALINA_HOME/webapps/test ← testディレクトリ作成
# chown test:test $CATALINA_HOME/webapps/test ← 所有者の変更
$ mkdir $CATALINA_HOME/webapps/test/WEB-INF ← WEB-INFディレクトリ作成
$ mkdir $CATALINA_HOME/webapps/test/WEB-INF/classes ← classesディレクトリ作成
$ mkdir $CATALINA_HOME/webapps/test/WEB-INF/lib ← libディレクトリ作成
 ユーザ権限でディレクトリ及びファイルを作成した場合のアクセス権は、「drwxrwxr-x」及び「-rw-rw-r--」となります。

●配備記述子(web.xml)の作成(一般ユーザ権限)

 WEB-INFディレクトリにweb.xmlファイルを作成し、サーブレットマッピングを記述します。サーブレットマッピングにより、特定のURLとサーブレットクラスが結び付けられます。サーブレットマッピングはweb.xmlの<web-apps></web-apps>要素の間に記述します
$ vi $CATALINA_HOME/webapps/test/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>
    display Hello World
  </description>
  <display-name>HelloWorld Examples</display-name>
  <servlet>
    <servlet-name>
      hello
    </servlet-name>
    <servlet-class>
      HelloWorld_servlet
    </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>
      hello
    </servlet-name>
    <url-pattern>
      /hello/
    </url-pattern>
  </servlet-mapping>
</web-app>
 以上でWebアプリケーションの標準構成ができあがりました。
 なお、web.xmlを追加・編集した場合、Tomcatが自動的に検知して新しい設定を反映してくれるためTomcatの再起動は必要ありません。この機能は「ホットデプロイ」と言われます。
 上記のWeb.xmlの場合、「htto://localhost:8080/test/hello/」にアクセスすると、HelloWorldアプリケーションが実行されます。

●Webアプリケーション配置ディレクトリを変更する

 TomcatのデフォルトのWebアプリケーション配置場所は「$CATALINA_HOME/webapps」ディレクトリですが、Webアプリケーションごとに「$CATALINA_HOME/webapps」ディレクトリ以下とは違う場所を指定することが可能です。Webアプリケーションを別の場所に格納することにより、次のようなメリットがあります。
  • 頻繁に変更されるアプリケーションファイルとめったに変更されないサーバファイルを切り離して管理できること
  • Tomcatのインストールディレクトリに対する読み書きの権限を管理者だけに制限することでセキュリティを強化でき、一般ユーザは別の場所に移動したwebappsディレクトリに対する読み書きの権限を与えられること

 ユーザtestのホームディレクトリ(/home/test)にWebアプリケーションディレクトリを配置するとします。Webアプリケーション配置ディレクトリを「/home/test/webapps」とし、サーブレット及びJSPが利用できるように設定します。
$ ls -l /home ← ホームディレクトリのアクセス権確認
drwx------ 40 test test 4096 2009-01-01 01:00 test
 上記のアクセス権では、TomcatがWebアプリケーションの設定ファイル等を読み込むことができませんので、下記のように変更します。
$ chmod 701 /home/test ← ホームディレクトリのアクセス権変更
$ ls -l /home ← ホームディレクトリのアクセス権確認
drwx-----x 40 test test 4096 2009-01-01 01:00 test
「WEB-INF」ディレクトリ、「classes」ディレクトリ、「lib」ディレクトリ等を作成します。
$ mkdir /home/test/webapps ← webappsディレクトリ作成
$ mkdir /home/test/webapps/WEB-INF ← WEB-INFディレクトリ作成
$ mkdir /home/test/webapps/WEB-INF/classes ← classesディレクトリ作成
$ mkdir /home/test/webapps/WEB-INF/lib ← libディレクトリ作成
 テスト用JSPファイルをTomcatの設定のTomcatのバージョン確認を参照して、「/home/test/webapps」に作成します。
$ vi /home/test/webapps/test.jsp ← test.jspファイルの作成
 しかし、このままではWebブラウザでtest.jspの結果を表示させることは出来ません。表示させることができるようにするため、コンテキストファイルを作成します。

●コンテキストファイルを作成する

 Webアプリケーションは、コンテキストという単位で管理されています。Webアプリケーションをデフォルトのディレクトリ(「$CATALINA_HOME/webapps」以下)以外に配置したい場合は、Tomcatに新しいコンテキストを追加する必要があります。コンテキストを追加する方法には の2種類があります。
 Tomcat5より前のバージョンではserver.xmlファイルのWebアプリケーションのContext要素を追加していましたが、Tomcat5以降のバージョンではコンテキストファイルを作成することを推奨しています。Tomcat6では、<Context>タグはserver.xmlに記述することは推奨されていないため、コンテキストファイルに記述するのが一般的です。
 コンテキストファイルは「$CATALINA_HOME/conf/Catalina/localhost」ディレクトリに作成します。しかし、このディレクトリのアクセス権は

・tar形式からインストールした場合
# ls -l $CATALINA_HOME/conf/Catalina
drwxr-xr-x 2 root root 4096 2009-02-24 17:48 localhost
・rpm形式からインストールした場合
# ls -l $CATALINA_HOME/conf/Catalina
drwxrwxr-x 2 root tomcat 4096 2009-02-24 20:04 localhost
 のようになっており、デフォルトの状態ではユーザ権限ではコンテキストファイルを作成することが出来ません。

 そこで、以下のように対処します。
・rpm形式からインストールした場合
 デフォルトで$CATALINA_HOME/conf/Catalina/localhostディレクトリのグループが「tomcat」、そのグループのパーミッションが「rwx」になっていますので、コンテキストファイルを作成させたいユーザをtomcatグループに追加することにより作成することができるようになります。
 ただし、この方法には下記のような問題点があります。確実に問題点を避けるには、コンテキストファイルを管理者が設定または保存する方法がいいでしょう。
    問題点
  • tomcatグループに所属しているユーザは、他のユーザが作成したコンテキストファイルを編集・削除することができてしまうので注意する必要があります。
  • インストールしたTomcat関連ファイルも編集・削除することができてしまうので注意する必要があります。

  •  一つ上の親ディレクトリのグループが「tomcat」、そのグループのパーミッションが「rwx」の場合は、tomcatグループに所属するどのユーザでも、そのディレクトリ内にあるファイル・ディレクトリ(所有者・グループ・パーミッションのいかんにかかわらず)を編集・削除することができてしまいます。これは「webapps」ディレクトリが該当しています。
    上記問題点の解決方法
  • ・問題点1対策
    $CATALINA_HOME/conf/Catalina/localhost以下のファイルを常時バックアップする。
  • ・問題点2対策
    デフォルトで$CATALINA_HOME/conf/Catalina/localhostディレクトリのグループを「tomcat」から、グループを新たに作成し、例えば「tomcatusers」に変更します。このtomcatusersにtomcatユーザ及びコンテキストファイルを作成させたいユーザを追加します。

  •  なお、tomcatusersにtomcatユーザを追加しなくても、「その他」グループのパーミッションが「r-x」となっていればTomcat Web アプリケーションマネージャは動作します。

・tar形式からインストールした場合
 デフォルトで$CATALINA_HOME/conf/Catalina/localhostディレクトリのグループが「root」、そのグループのパーミッションが「r-x」になっています。rpm形式からインストールした場合と同じグループ・パーミッションになるようにグループを「tomcat」、そのグループのパーミッションを「rwx」に変更します。それから、コンテキストファイルを作成させたいユーザをtomcatグループに追加することにより、コンテキストファイルを作成することができるようになります。
 この方法によりコンテキストファイルを保存できるようになりますが、rpm形式からインストールした場合と同様の問題点が残ります。

 「/home/test/webapps/test.jsp」をhttp://localhost:8080/test/test.jspとしてブラウザで表示させるようにするには
$ vi $CATALINA_HOME/conf/Catalina/localhost/test.xml ← test用コンテキストファイルの作成
<Context path="/test" docBase="/home/test/webapps"></Context>
のように作成します。
 ただし、コンテキストファイルの「path」名とWebアプリケーションの配備で説明した「$CATALINA_HOME/webapps」以下に作成したディレクトリ名が同じ場合、Tomcat Web アプリケーションマネージャの表示では、後者が優先します。

属性名 説明
path Webアプリケーションにアクセスするための任意名のcatalina_homeをルートディレクトリとしたURLのパスです。
docBase Webアプリケーションを配置したディレクトリのcatalina_homeからの相対パスまたはHOSTマシン上の絶対パスです。
debug デバッグレベルを0から9で指定します。9を指定すると詳細なログを出力を書き出します。
privileged trueに指定した場合、コンテキストはコンテナが定義したサーブレットを使用できます。
reloadable 更新時にオートリロードを使うかをtrueかfelseで指定します。ディフォルトではfelseになっています。


●アクセスログ

 Tomcatのアクセスログ設定はserver.xmlやコンテキストファイルに設定する<Valve>タグで行います。アクセスログとはコンテキストに設置されたJSP、サーブレット、HTML、GIFファイルなどのアクセス状況を表すログで、Tomcat動作に関するログ(エラーログなど)とは異なります。Tomcat動作に関するログは<Logger>タグで行います。<Valve>タグでは、ログファイル名、ログパターンなどを指定できます。
 <Valve>タグは<Engine>タグ、<Host>タグ、<Context>タグのサブ要素として設定できます。<Engine>タグのサブ要素として設定した場合はそのTomcatエンジンすべてのアクセスログを生成します。<Host>タグのサブ要素として設定した場合はTomcatエンジン内に設定したある仮想ホストすべてのアクセスログを生成します。<Context>タグのサブ要素として設定した場合は、設定されたコンテキストのすべてのアクセスログを生成します。
 以下はアクセスログ生成で指定できる<Valve>タグの属性です。

属性 内容 デフォルト 必須
className アクセスログを生成するJavaクラスを指定。値はorg.apache.catalina.valves.AccessLogValveでなければならない。 -
directory アクセスログが生成されるディレクトリを指定。相対PATHで指定した場合は、$CATALINA_HOME以下に指定ディレクトリが続く形になる。指定ディレクトリがない場合はログ生成時に作成される。 logs -
pattern アクセスログのフォーマットを%a、%qなどの指定値で指定できる。詳細はTomcatドキュメントを参照。 common -
prefix アクセスログが生成されるファイル名の最初に来る名前を指定する。prefix自体を指定したくない場合は0を指定する。 access_log -
resolveHosts リモートホストのIPアドレスをDNS名前解決により、ホスト名に変換するかどうかを指定する。trueに指定した場合はサーバに負荷がかかる。 false -
suffix アクセスログが生成されるファイル名の最後に来る名前を指定する。 " " -
rotatable ログファイルのローテートを行うかどうかを指定する。 true -
condition ServletRequest.getAttribute( )の値がNullの場合のみログを生成する。たとえば、condition="key"と設定されており、ServletRequest.getAttribute("key") == nullの場合のみそのアクセスログが生成される。 - -
fileDateFormat アクセスログをローテートする場合にファイル名に付与される日付フォーマットを指定する。また、ローテートのタイミングを指定することもできる。yyyy-MM-dd.HHと設定することにより毎時ローテートが行われる。 yyyy-MM-dd -


 アクセスログ生成における<Valve>タグの設定例を記載します。
<Host name="localhost" debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

  <Valve className="org.apache.catalina.valves.AccessLogValve"
         directory="logs/AccessLog" prefix="tomcat_accs_" suffix=".log" pattern="common"/>

</Host>
  • localhostと指定された仮想ホストすべてのアクセスログを生成するため、server.xmlファイルの<Host>タグの配下に<Valve>タグを設定します。コンテキストファイルの場合は、<Valve>タグのみを設定します。
  • アクセスログが生成されるディレクトリは$CATALINA_HOME/logs/AccessLogとします。AccessLogディレクトリが存在しない場合は、アクセス時に自動で作成されます。
  • アクセスログファイルの先頭文字はtomcat_accs_とします。
  • アクセスログファイルの後方文字は.logとします。
 Tomcatを再起動(コンテキストファイルの場合は再起動の必要はありません。)し、いくつかのファイルにアクセスします。$CATALINA_HOME/logs/AccessLogディレクトリにtomcat_accs_2008-12-23.logファイルが作成され、以下のようなアクセスログが生成されます。
127.0.0.1 - - [23/Dec/2008:10:54:27 +0000] "GET /jsp-examples/ HTTP/1.1" 200 14551 
127.0.0.1 - - [23/Dec/2008:10:54:27 +0000]
                  "GET /jsp-examples/images/code.gif HTTP/1.1" 200 292 
127.0.0.1 - - [23/Dec/2008:10:54:27 +0000]
                  "GET /jsp-examples/images/return.gif HTTP/1.1" 200 1231 
127.0.0.1 - - [23/Dec/2008:10:54:27 +0000]
                  "GET /jsp-examples/images/execute.gif HTTP/1.1" 200 1242 

●アクセス制限

 Tomcatでは、<Valve>タグを使用し、アクセスしてくる端末をIPアドレス、ホスト名により制限することができます。<Valve>タグは<Engine>タグ、<Host>タグ、<Context>タグのサブ要素として設定できます。<Engine>タグのサブ要素として設定した場合はそのTomcatエンジンすべてに対するアクセスを制限します。<Host>タグのサブ要素として設定した場合は設定した仮想ホストに対するアクセスを制限します。<Context>タグのサブ要素として設定した場合は、設定したコンテキストに対するアクセスを制限します。

属性 内容 デフォルト 必須
className アクセスフィルタを行うJavaクラスを指定。IPアドレスによりフィルタする場合はorg.apache.catalina.valves. RemoteAddrValveでなければならない。ホスト名によりフィルタする場合はorg.apache.catalina.valves. RemoteHostValve.でなければならない。 -
allow アクセスを許可するIPアドレス、ホスト名を指定。 allowが設定されている場合は、設定されているもののみアクセスを許可する。allowが設定されていない場合は、denyに設定されていないもののみアクセスを許可する。 IPアドレス、ホスト名は正規表現で指定できる。複数指定する場合は,(カンマ)を使用する。 - -
deny アクセスを拒否するIPアドレス、ホスト名を指定。 denyが設定されている場合は、設定されているもののみアクセスを拒否する。denyが設定されていない場合は、アクセスはallowの設定に依存する。 IPアドレス、ホスト名は正規表現で指定できる。複数指定する場合は,(カンマ)を使用する。 - -


 アクセス制限における<Valve>タグの設定例を記載します。
<Host name="localhost"
      debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">

  <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192.0.0.*, 127.0.0.*" />

</Host>
  • localhostと指定された仮想ホストに対するすべてのアクセスを制限するため、server.xmlファイル(または、コンテキストファイル)の<Host>タグの配下に<Valve>タグを設定します。コンテキストファイルの場合は、<Valve>タグのみを記載します。
  • 192.0.0.*のアドレスと127.0.0.*のアドレスからのアクセスをdeny属性を使用し拒否します。
 Tomcatを起動し、http://localhost:8080/にアクセスします。127.0.0.*のアドレスは拒否されているため、ローカルホスト(127.0.0.1)からのアクセスは拒否されます。

●JDBC接続

 ここでは、TomcatからJDBCを使用してデータベースMySQLにアクセスする方法について解説します。MySQL以外(Oracle8i、PostgreSQL)のJDBC接続例がTomcatドキュメントにありますので、そちらもあわせて参照してください。
 JDBCでデータベースに接続するにはいくつかの方法があります。ここでは、メンテナンス性、非データベース依存などの関係から現在最もよいとされているJNDIを利用した接続方法について解説します。
 JNDI(Java Naming and Directory Interface)とはNIS、ActiveDirectoryなどのディレクトリサービスを利用するためのJavaAPIです。ディレクトリサービス実行環境に依存せず、Javaアプリケーションからディレクトリサービスを利用することができます。現在ではディレクトリサービスだけでなく、Javaアプリケーションがデータベース、メールサーバなどのリソースを見つけるためのAPIとしても利用されます。
 JNDIリソースとしてJDBCを設定することにより、JavaアプリからはJNDIリソースを指定することでJDBCを利用することができます。データベースが変更された場合でもJNDIリソースを変更するだけでJavaアプリに影響を与えることはありません。
 具体的にはserver.xmlコンテキストファイルにJNDIリソースの設定、web.xmlにJNDIリソースを参照する設定、JavaアプリにJNDIリソースを呼び出すコードを記載することでJDBC接続を行います。

TomcatのJDBC接続

JDBCの設定

◆MySQLの場合
 MySQLのJDBCライブラリとして「MySQL Connector/J」という製品を使用します。
 http://www.mysql.com/downloads/api-jdbc.htmlに「MySQL Connector/J for connecting to MySQL from Java」という項目がありますので、最新版をダウンロードします。
 ダウンロードしたファイルを解凍して、その中から「mysql-connector-java-*.*.*-bin.jar」を下記のlibディレクトリに設置します。これでJDBCの設定の終了です。
# tar zxvf mysql-connector-java-5.1.7.tar.gz
# cp mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jar $CATALINA_HOME/common/lib
 ↑ Tomcat5.5の場合
# cp mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jar $CATALINA_HOME/lib
 ↑ Tomcat6.0の場合
ディレクトリ構成については、●Tomcatのディレクトリ構成を参照
# chown tomcat:tomcat $CATALINA_HOME/common/lib/mysql-connector-java-*.*.*-bin.jar
 ↑ Tomcat5.5の場合
# chown tomcat:tomcat $CATALINA_HOME/lib/mysql-connector-java-*.*.*-bin.jar
 ↑ Tomcat6.0の場合
 ライブラリを読みこませるためTomcatを再起動します。
 ・yumコマンドでインストールする場合
# yum install mysql-connector-java
/usr/share/javaディレクトリにコネクターがインストールされる。
Tomcat6.0をバイナリパッケージからインストールした場合、$CATALINA_HOME/libディレクトリは
/usr/share/java/tomcat6ディレクトリにリンクしているので、下記のようにする。
# ln -sfn /usr/share/java/mysql-connector-java.jar /usr/share/java/tomcat6/mysql-connector-java.jar
 ライブラリを読みこませるためTomcatを再起動します。
 MySQL用のコネクターがインストールされていない、または、Tomcatを再起動していない場合、下記のようなエラーが表示されます。

org.apache.jaspar.JasperException: Cannnot load JDBC driver class 'com.mysql.jdbc.Driver'

◆PostgreSQLの場合
 コンパイルされたバージョンのドライバは、PostgreSQL JDBCのWebサイト から入手できます。
 左側の「download」をクリック、インストールされている「JDK」のバージョンにあったドライバをダウンロードします。
 ダウンロードした「postgresql-*.*-***.jdbc*.jar」を下記のlibディレクトリに設置します。これでJDBCの設定の終了です。
# cp postgresql-*.*-***.jdbc*.jar $CATALINA_HOME/common/lib
 ↑ Tomcat5.5の場合
# cp postgresql-*.*-***.jdbc*.jar $CATALINA_HOME/lib
 ↑ Tomcat6.0の場合
ディレクトリ構成については、●Tomcatのディレクトリ構成を参照
# chown tomcat:tomcat $CATALINA_HOME/common/lib/postgresql-*.*-***.jdbc*.jar
 ↑ Tomcat5.5の場合
# chown tomcat:tomcat $CATALINA_HOME/lib/postgresql-*.*-***.jdbc*.jar
 ↑ Tomcat6.0の場合
 ダウンロードしたJDBCドライバのCLASSPATHを設定します。
# vi /etc/profile ← 環境変数を編集
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/common/lib/postgresql-*.*-***.jdbc*.jar
 ↑ Tomcat5.5の場合
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/postgresql-*.*-***.jdbc*.jar
 ↑ Tomcat6.0の場合
# source /etc/profile ← 環境変数を反映
 ・yumコマンドでインストールする場合
# yum install postgresql-jdbc
/usr/share/javaディレクトリにコネクターがインストールされる。
Tomcat6.0をバイナリパッケージからインストールした場合、$CATALINA_HOME/libディレクトリは
/usr/share/java/tomcat6ディレクトリにリンクしているので、下記のようにする。
# ln -sfn /usr/share/java/postgresql-jdbc.jar /usr/share/java/tomcat6/postgresql-jdbc.jar
 ライブラリをTomcatに読みこませるため再起動する。
 CLASSPATHが追加されていない場合、PostgreSQL用のコネクターがインストールされていない、JDKのバージョンに対応したコネクターがインストールされていない場合、または、Tomcatを再起動していない場合、下記のようなエラーが表示されます。

org.apache.tomcat.dhcp.dhcp.SQLNestedException: Cannnot load JDBC driver class 'org.postgresql.Driver'

java.lang.ClassNotFoundException: org.postgresql.Driver

MySQLの設定

 Javaアプリからアクセスされるため、MySQLインストール、MySQLユーザの作成、データベースの作成、テーブルの作成、データのテーブルへの挿入をMySQLに対して行います。MySQLの設定方法についてはここでは省略します。以下のURLを参照するなどしてMySQLの設定を行ってください。
 MySQLデータベースの設定:https://pub2.bigbang.dyndns.org/mysql-x.htm
 MySQL日本語ドキュメント:http://www.mysql.com/doc/ja/index.html
 @IT:快速MySQLでデータベースアプリ!
 @IT:今から始める MySQL入門

 MySQLデータベースの設定:データベースの作成を参照して、データベースを作成します。

server.xmlの設定(MySQL編)

 JNDIリソースの設定は、Tomcat5までは下記のとおり<Resource>タグと<ResourceParams>タグを使用する(JNDIデータソースの手引き参照)こととなっていますが、実際にはTomcat5.5以降は、これでは動作しません。JNDI Datasource HOW-TOの「2. Context configuration」のとおりコンテキストファイルを使用して記載します。
 ただし、Tomcat5以降からコンテキストファイルの保存場所が「$CATALINA_HOME/conf/Catalina/localhost」ディレクトリであることから、JNDIリソースを使用するWebアプリケーションはベースディレクトリである「$CATALINA_HOME/webapps」には配備できないことになります。
 以下の方法により、server.xmlでJNDIリソースの設定を行っても「org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'」と言うエラーが表示されます。
 したがって、JNDIリソースの設定は、コンテキストファイルの設定を参照してください。


 server.xmlでJNDIリソースの設定を行います。JNDIリソースの設定には<Resource>タグと<ResourceParams>タグを使用します。<Resource>タグでJNDIリソースの指定を行い、<ResourceParams>タグで指定の際に使用するパラメータの設定を行います。<Resource>タグ、<ResourceParams>タグは<GlobalNamingResouces>タグ、<DefaultContext>タグ、<Context>タグのサブ要素として指定できます。

【<Resource>タグの属性】
要素 内容 デフォルト 必須
auth リソースマネージャに接続する主体を指定する。Javaアプリが接続する場合は「Application」と、Javaアプリを代表してTomcatコンテナが接続する場合は「Container」と指定する。 - -
description <Resource>タグの説明を記載。 - -
name JNDIリソースの名前を指定。指定された名前はjava:comp/envの相対パスとして参照される。 -
scope JNDIリソースとのコネクションが共有可能か指定する。「Shareable」もしくは、「Unshareable」を指定する。 Shareable -
type JNDIリソースのクラス型、インタフェース型を指定する。 -


【<ResourceParams>タグの属性】
要素 内容 デフォルト 必須
name JNDIリソースの名前を指定。<Resource>タグのname属性の値と同一でなければならない。 -


 <ResourceParams>タグには<parameter>タグでJNDIリソースの動作設定を行う必要があります。以下にJNDIリソースがJDBCである場合の主な設定項目を記載します。すべての設定項目はJavadocsのBasicDataSourceクラスを参照してください。

パラメータ名 内容
factory JDBC接続のデータ管理に使用するJavaクラスを指定。値はorg.apache.commons.dbcp.BasicDataSourceFactoryになる。
maxActive データベース接続の最大接続数を指定。0の場合は無制限になる。
maxIdle アイドル状態になっている最大接続数を指定。0の場合は無制限になる。
maxWait 接続しているコネクションが再度利用されるまでの待ち時間を指定。指定した時間をすぎると例外が発生する。-1の場合は無制限になる。
username データベースに接続するためのユーザIDを指定。
password データベースに接続するためのパスワードを指定。
driverClassName JDBCドライバのJavaクラスを指定。MySQL Connector/Jの場合は、org.gjt.mm.mysql.Driverになる。
url JDBC接続のためのJDBC準拠のURLを指定。


 <Resource>タグ、<ResourceParams>タグのserver.xmlへの設定を以下に記載します。<Host>タグのサブ要素として<DefaultContext>タグを追加し、そのサブ要素として両タグを設定します。

<Host name="localhost" debug="0" appBase="/home/test/java/JDBCTest"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
  <!-- 1.DefaultContextタグの追加 -->
  <DefaultContext>
    <!-- 2.Resourceタグの追加 -->
    <Resource name="jdbc/MySQL" auth="Container" 
              type="javax.sql.DataSource"/>
    <!-- 3.ResourceParamsタグの追加 -->
    <ResourceParams name="jdbc/MySQL">
      <!-- 4.parameterタグの追加 -->
      <parameter>
        <name>factory</name>
        <value>
          org.apache.commons.dbcp.BasicDataSourceFactory
        </value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>20</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>30000</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>100</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>myuser</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>mypass</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>org.gjt.mm.mysql.Driver</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:mysql://localhost:3306/auth?autoReconnect=true</value>
      </parameter>
    </ResourceParams>
  </DefaultContext>

  • タグのサブ要素として<DefaultContext>タグを追加します。このタグで設定された要素はすべてのコンテキストに適用されます。
  • <Resource>タグを追加します。JNDIリソースは「jdbc/MySQL」という名前で参照され、リソースマネージャへの接続はTomcatコンテナが行い、JNDIリソースがJavaインタフェース型「javax.sql.DataSource」を返すことを表しています。
  • ResourceParams>タグを追加します。name属性に「jdbc/MySQL」を設定し、上記の<Resource>タグに関連する設定であることを表しています。
  • <parameter>タグを使用し、JNDIリソースの動作設定を行います。<name>タグにパラメータ名、<value>タグにパラメータ名に対応する値を設定します。
コンテキストファイルの設定

 Tomcat5.5以降でJNDIリソースの設定をする場合は、<Context>タグを使用します。コンテキストファイルは「$CATALINA_HOME/conf/Catalina/localhost」ディレクトリに作成します。今回はMySQL用に「JDBCTest_mysql.xml」、PostgreSQL用に「JDBCTest_pgsql.xml」というファイル名で作成します。
◆MySQL用
<?xml version="1.0" encoding="UTF-8"?>
  <Context path="JDBCTest_mysql" docBase="/home/test/java/JDBCTest_mysql" reloadable="true" crossContext="true">
    <Resource name="jdbc/MySQL" auth="Container" type="javax.sql.DataSource" maxActive="20"
          maxIdle="30000" maxWait="100" username="myuser" password="mypass"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/auth?autoReconnect=true" />
  </Context>
◆PostgreSQL用
<?xml version="1.0" encoding="UTF-8"?>
  <Context path="JDBCTest_pgsql" docBase="/home/test/java/JDBCTest_pgsql" reloadable="true" crossContext="true">
    <Resource name="jdbc/postgres" auth="Container" type="javax.sql.DataSource" maxActive="20"
          maxIdle="30000" maxWait="100" username="myuser" password="mypass"
          driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://localhost:5432/auth" />
  </Context>

web.xmlの設定

 web.xmlでは<resource-ref>タグを使用してserver.xmlコンテキストファイルで設定したJNDIリソースを参照する設定を行います。これにより、JavaアプリからJNDIリソースが利用できるようになります。

【<resource-ref>タグのサブ要素】
要素 内容 デフォルト 必須
description <resource-ref>タグの説明を記載。 - 0以上
res-ref-name JNDIリソースの名前を指定。指定された名前はjava:comp/envの相対パスとして参照される。 - 必須
res-type JNDIリソースのクラス型、インタフェース型を指定する。 - 必須
res-auth リソースマネージャに接続する主体を指定する。Javaアプリが接続する場合は「Application」と、Javaアプリを代表してTomcatコンテナが接続する場合は「Container」と指定する。 - 必須
res-sharing-scope JNDIリソースとのコネクションが共有可能か指定する。「Shareable」もしくは、「Unshareable」を指定する。 Shareable optional


 web.xmlの設定を以下に記載します。
◆MySQL用
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!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>MySQL Test</display-name>
      <description>MySQL Test App</description>
      <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/MySQL</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
    </web-app>
◆PostgreSQL用
<?xml version="1.0" encoding="ISO-8859-1"?>
  <!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>PostgreSQL Test</display-name>
      <description>PostgreSQL Test App</description>
      <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/postgres</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
    </web-app>
  • res-ref-name>タグに今回設定したJNDIリソース名である「jdbc/MySQL」(PostgreSQLの場合は「jdbc/postgres」)を指定します。
  • <res-type>タグにJNDIリソースが返すデータ型である「javax.sql.DataSource」インタフェースを指定します。
  • <res-auth>タグにリソースマネージャの接続主体であるTomcatコンテナ「Container」を指定します。
Javaアプリの作成(MySQL編)

 JDBC接続の動作確認をするためにMySQLデータベースにアクセスし、データベース内のデータを表示するJSPプログラムを作成します。

 以下のページも参考になります。
 JavaでHello World:JDBC(MySQL)編
# vi showTable_mysql.jsp
<%@ page import="java.sql.*,
                javax.sql.*,
                javax.naming.InitialContext,
                javax.naming.Context" %>
<html>
<head><title>showTable_mysql.jsp</title></head>
<body>
<%
  InitialContext initCon = new InitialContext(); //1
  DataSource ds = (DataSource)initCon.lookup("java:comp/env/jdbc/MySQL"); //2
  Connection con = ds.getConnection(); //3.JNDIリソースへのコネクト
  Statement stmt = con.createStatement(); //4
  ResultSet result = stmt.executeQuery("select * from city;"); //5.SQL文の実行
%>
<table border="1">
  <tr>
    <th>Country</th>
    <th>Capital</th>
  </tr>
  //6.データの表示
  <%
    while (result.next()) {
  %>
  <tr>
    <td> <%= result.getString(1) %></td>
    <td> <%= result.getString(2) %></td>
  </tr>
  <%
    }
    //7.コネクトのクローズ
    con.close();
    initCon.close();
  %>
</table>
</body>
</html>
  • JNDIリソースを見つけるネーミング操作のためのInitalContextオブジェクトinitConを生成します。
  • lookupメソッドを使用し、JNDIリソースを見つけます。引数にはjava:comp/env/jdbc/MySQLを指定します。
  • JNDIリソースへコネクトを行います。
  • SQL文をデータベースに送信するためのStatementオブジェクトstmtを生成します。
  • 「select * from city;」を実行し、実行結果を変数resultに代入します。
  • whileループを使用し、すべての実行結果を表示します。
  • JNDIリソースへのコネクトをcloseします。
動作確認

 JDBC接続の動作確認を行います。
 これまで作成したファイルを該当箇所に配置します。server.xmlは$CATALINA_HOME/conf配下のserver.xmlを変更しているため、特にファイルの配置はありません。web.xml、showTable_mysql.jspは該当するコンテキストに配置します。コンテキストのディレクトリとして$CATALINA_HOME/webapps/home/test/java配下にJDBCTest_mysqlディレクトリを作成します。その配下にweb.xml、showTable_mysql.jspを配置します。配置箇所は以下のようになります。

ファイルの配置

 MySQL、Tomcatを起動させhttp://localhost:8080/JDBCTest_mysql/showTable_mysql.jspにアクセスします。MySQLの格納データが表示されると正しくJDBC接続が行われています。

実行結果

PostgreSQLの設定

 Javaアプリからアクセスされるため、PostgreSQLインストール、PostgreSQLユーザの作成、データベースの作成、テーブルの作成、データのテーブルへの挿入をPostgreSQLに対して行います。PostgreSQLの設定方法についてはここでは省略します。以下のURLを参照するなどしてPostgreSQLの設定を行ってください。
 PostgreSQLデータベースの設定:https://pub2.bigbang.dyndns.org/postgresql-x.htm
 PostgreSQL日本語ドキュメント:http://www.postgresql.jp/document/
 @IT:連載記事 「PostgreSQLで作るLinuxデータベース」
 @IT:使えば分かるPostgreSQL運用&チューニング

 PostgreSQLデータベースの設定:データベースの作成を参照してデータベースを作成します。

server.xmlの設定(PostgreSQL編)

 JNDIリソースの設定は、Tomcat5までは下記のとおり<Resource>タグと<ResourceParams>タグを使用する(JNDIデータソースの手引き参照)こととなっていますが、実際にはTomcat5.5以降は、これでは動作しません。JNDI Datasource HOW-TOの「2. Context configuration」のとおりコンテキストファイルを使用して記載します。
 ただし、Tomcat5以降からコンテキストファイルの保存場所が「$CATALINA_HOME/conf/Catalina/localhost」ディレクトリであることから、JNDIリソースを使用するWebアプリケーションはベースディレクトリである「$CATALINA_HOME/webapps」には配備できないことになります。
 以下の方法により、server.xmlでJNDIリソースの設定を行っても「org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'」と言うエラーが表示されます。
 したがって、JNDIリソースの設定は、コンテキストファイルの設定を参照してください。


Javaアプリの作成(PostgreSQL編)

 JDBC接続の動作確認をするためにPostgreSQLデータベースにアクセスし、データベース内のデータを表示するJSPプログラムを作成します。

 以下のページも参考になります。
 JavaでHello World:JDBC(PostgreSQL)編
# vi showTable_pgsql.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.sql.*,
                javax.sql.*,
                javax.naming.*"%>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>showTable_pgsql.jsp</title>
 </head>
 <body>
  <h2>showTable_pgsql</h2>
  <%
    Context initContext = new InitialContext();
    DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/postgres");
    Connection con = ds.getConnection();
    out.println("con=" + con.toString() + "<br />"+ "<br />");
    // 全ての行を検索するSQL文を作成
    Statement stmt = con.createStatement();
    String sql = "select * from city";
    // クエリーを実行して結果セットを取得
    ResultSet rs = stmt.executeQuery(sql);
  %>
<table border="1">
  <tr>
    <th>Country</th>
    <th>Capital</th>
  </tr>
  <%
    // 検索された行数分ループ
    while (rs.next()) {
  %>
  <tr>
    <td> <%= rs.getString(1) %></td>
    <td> <%= rs.getString(2) %></td>
  </tr>
  <%
    }
    con.close();
    initContext.close();
  %>
</table>
 </body>
</html>
 プログラムを実行すると下記のようなエラーが表示される事があります。

 左記を参照してください。 PostgreSQLデータベース設定●エラー対処

動作確認

 JDBC接続の動作確認を行います。
 これまで作成したファイルを該当箇所に配置します。server.xmlは$CATALINA_HOME/conf配下のserver.xmlを変更しているため、特にファイルの配置はありません。web.xml、showTable_pgsql.jspは該当するコンテキストに配置します。コンテキストのディレクトリとして$CATALINA_HOME/webapps/home/test/java配下にJDBCTest_pgsqlディレクトリを作成します。その配下にweb.xml、showTable_pgsql.jspを配置します。配置箇所は以下のようになります。

ファイルの配置

 PostgreSQL、Tomcatを起動させhttp://localhost:8080/JDBCTest_pgsql/showTable_pgsql.jspにアクセスします。PostgreSQLの格納データが表示されると正しくJDBC接続が行われています。
 下記のようなエラーが表示される場合は、JDBCの設定を参照してください。

org.apache.tomcat.dhcp.dhcp.SQLNestedException: Cannnot load JDBC driver class 'org.postgresql.Driver'

java.lang.ClassNotFoundException: org.postgresql.Driver

●TomcatとApacheの連携

 TomcatもWebサーバ機能を持っていますが、従来のWebサーバソフトと比較すると性能が良くなく検証作業など内部利用にとどめた方が良いと言われています。本格的なWebサーバ機能が必要なシステムでは、Apache、IISなどの専用WebサーバソフトとTomcatを連携して使用します。以下に、TomcatのWebサーバ機能を利用すべきでないと言われている理由を記載します。
  • TomcatのWebサーバ機能は歴史が浅く、Webサーバ専用ソフトと比較すると安定性が悪く、セキュリティも高くない。
  • TomcatのWebサーバ機能は一般に高速ではない。
  • Webサーバ専用ソフトを使用することにより静的コンテンツと動的コンテンツの処理を分散させることができる。
 TomcatとApacheを連携させるには、通常、“AJPコネクタ”という機能を利用して実現します。Apacheのバージョンが2.0系の場合はmod_jkを使用し、2.2系の場合はmod_proxy_ajpを使用(mod_jkの利用も可能)します。

 RPM版Apache2.2とRPM版Tomcat5.5では、mod_jk及びmod_proxy_ajpどちらでも連携できます。
 RPM版Apache2.2とソース版Tomcat6.0では、mod_jkでは連携できませんでした。

 Apache http及びTomcatのインストール及び動作確認が完了しているものとします。
 Tomcat Projectから「Download」→「Tomcat Connectors」を選び、「JK 1.2」の.tar.gz版のソースをDownloadします。
 また、mod_jkのコンパイルにはApacheのソース、apxs(httpd moduleのコンパイル・Install支援ツール)が必要です。linuxのRedHat系のOSでは、httpd-develのrpm(apxs等が含まれています。)をインストールしておく必要があります。
 Apacheのソースは使用するApacheのバージョンと同じものをApache.orgから取得しておきます。取得したApacheのソースは/usr/local/srcディレクトリ以下に解凍します。
 同じく/usr/local/srcディレクトリにtomcat-connectorsのソースを解凍します。

mod-jkのインストール
# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache//tomcat/ tomcat-connectors/jk/tomcat-connectors-1.2.32-src.tar.gz
# tar zxvf tomcat-connectors-1.2.**-src.tar.gz
# cd tomcat-connectors-1.2.**-src/native
# ./configure --with-apxs=/usr/sbin/apxs ← apxsの場所を指定
エラーが出るようならば「--with-apache=PATH」でApache httpのソースのディレクトリへのPathを与えます。
# make
/usr/local/src/tomcat-connectors-1.2.**-src/native/apache-2.0/mod_jk.soができていることを確認します。
# apxs -n jk -i /usr/local/src/tomcat-connectors-1.2.**-src/native/apache-2.0/mod_jk.so
 ↑ fullパスで指定し、mod_jk.soをApache httpのmodules/にインストール
 上記は、cpコマンドを使用してApacheのmodulesディレクトリ以下
 (/usr/lib/httpd/modules)にコピーしても構いません。
 コピー後、他のモジュールと同じアクセス権限を与えます。

設定

 主にworkers.propertiesファイルとhttpd.conf(またはmod_jk.confまたはproxy_ajp.conf)とserver.xmlを設定します。
 Apache2.0の場合、workers.propertiesはhttpd.confと同じDirectoryに置きます。

 RPM版Tomcat5.5の場合の「workers.properties」は、/etc/tomcat5ディレクトリにあり、そのまま利用できます。
# cd /usr/local/src/tomcat-connectors-1.2.**-src/conf
# cp workers.properties /etc/httpd/conf
# vi /etc/httpd/conf/workers.properties
worker.list=tomcat1 ← 追記
worker.tomcat1.port=8009 ← 追記
worker.tomcat1.host=localhost ← 追記
worker.tomcat1.type=ajp13 ← 追記
 デフォルトの「workers.properties」は、上記の「tomcat1」の部分が「ajp13」となっています。「ajp13」をそのまま利用しても問題ありません。

要素 内容
worker.list 全worker(httpdとTomcatをつなぐ仮想的なパイプ?)の名前を列挙します。
worker.xxxx.port worker xxxxが担当するTomcatが待ち受けるPortを指定します。server.xmlにあわせます。(後述)
worker.xxxx.host worker xxxxが担当するTomcatが存在するIP Addressを指定します。
worker.xxxx.type 「ajp12」「ajp13」のどちらかを指定します。ajp13の方が新しいので普通はそちらを使います。この設定はserver.xmlの設定とあわせる必要があります。
worker.jkstatus.type=status ここでの「jkstatus」は特殊なworker定義で、mod_jkをWeb経由で参照・操作する事ができる画面のエンジンです。本番環境ではいらなければいらないですが、あると便利です。(特にsticky sessionの確認などで。)

 次に、Apache2.0の場合は、httpd.conf最後に追記します。
 Apache2.2の場合は、「proxy_ajp.conf」というファイルをetc/httpd/conf.dディレクトリに作成します(「mod_jk.conf」というファイルをetc/httpd/conf.dディレクトリに作成することも可能)。
 上記、いずれかのconfファイルを変更した場合は、Apacheを再起動する必要があります。
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
	JkWorkersFile	/etc/httpd/conf/workers.properties
	JkLogFile	/var/log/httpd/mod_jk.log
	JkMount		/jsp-examples/*	tomcat1
	JkMount		/*.jsp		tomcat1
</IfModule>
 RPM版Tomcat5.5とRPM版apache2.2の場合の「mod_jk.conf」は下記のとおりとなっていました。
LoadModule jk_module modules/mod_jk.so
JkWorkersFile	/etc/tomcat5/workers.properties
JkLogFile	/var/log/httpd/mod_jk.log
JkMount		/jsp-examples/*	ajp13
JkMount		/*.jsp		ajp13
要素 内容
LoadModule jk_module modules/mod_jk.so 先にInstallしたmod_jk.soをApache httpから使用する宣言です。
JkWorkersFile 先に作成したworkers.propertiesの場所を指定します。
JkLogFile mod_jk自体が出力するlogの場所を指定します。
JkMount Tomcatに処理をさせたいURLを指定します。「*」などでワイルドカード指定することも可能です。URLの次に実際に処理をさせるworkerを指定します。(wirkers.propertiesにあわせる。)

 Tomcat 6及びTomcat 7の場合の「proxy_ajp.conf」は下記のとおりです。
念のため「mod_proxy.so」もロードされているか確認してください。httpd.confに記載があるはずです。Fedora 20では、/etc/httpd/conf.modules.d/00-proxy.confに記載されていました。
# cat /etc/httpd/conf.d/proxy_ajp.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ProxyPass /tomcat/ ajp://localhost:8009/ ← 1
#ProxyPass /examples/ ajp://localhost:8009/jsp-examples/ ← 2
#ProxyPass /examples/ ajp://localhost:8009/examples/jsp ← Tomcat6の場合の記載方法
#<Location /examples/>
#  ProxyPass ajp://localhost:8009/jsp-examples/ ← 3
#</Location>
  • 「http://(ドメイン名)/tomcat」にアクセスしたら、「http://(ドメイン名):8080/」に転送されることを意味します。8009は、Tomcat側の連携コネクタのポート番号です。
  • 「http://(ドメイン名)/examples」にアクセスしたら、「http://(ドメイン名):8080/jsp-examples/」に転送されることを意味します。コメントアウトされています。
  • 2と同じ意味です。コメントアウトされています。
 「ProxyPass」で始まる行は1行しか記載することが出来ません。
 また、「ProxyPass」で始まる行と「<Location>」で始まる行を同時に記載することは出来ません。
 「proxy_ajp.conf」で「ajp://・・・」が複数行有効になっている場合、Apacheの再起動時に下記のようなエラーが表示されます(とりあえず動作する)。
[warn] worker ajp://localhost:8009/ already used by another worker
 最後にTomcatのserver.xmlを確認します。server.xmlはXMLファイル形式です。server.xmlは$CATALINA_HOME/confにあります。
確認点は、
 <Connector>タグで指定されている「port」がworkers.propertiesで指定したものと合っているか?
 <Connector>タグで指定されている「protocol」がworkers.propertiesで指定したものと合っているか?
 同じportを使っているConnectorが定義されている場合はコメントアウトします。
です。

起動・終了

 Apache + mod_jk + Tomcat環境では、Tomcat → Apacheの順番で起動する必要があります。
 ・Apacheが起動しているか確認します(ps aux | grep httpd)。起動している場合は終了させます。
 ・Tomcatを起動します。エラーが無い事を確認します。($CATALINA_HOME/logs/catalina.out)
 ・Apacheを起動します。
 ・エラーが無い事を確認します。(service使用の場合はOKが返れば問題ないことが多い。)
 ・mod_jkのエラーが無い事を確認します。(上の例では/var/log/httpd/mod_jk.log)
 実際にTomcatが処理するべきURLを開いて処理が行われているか確認します。前記の例だと、http://〜/jsp-examples/がTomcatで処理され、JSPのサンプルが見れるはずです

●Antの設定

 AntはJavaベースのビルドツールです。JavaソースコードをJavaVMが実行できるようにコンパイルすることをビルドと言います。通常Javaプログラムは複数のファイル、複数のクラスライブラリで構成されています。それらをビルドする際、1ファイルずつコンパイルし、コンパイルごとにクラスライブラリを指定してなどとすると大変手間がかかります。Antの定義ファイルにあらかじめ、どのファイルをどのタイミングで、どのクラスライブラリを使用して、と記載することでビルドの手間を大幅に削減することができます。
 AntはJakartaプロジェクトの中でも人気のあるツールの1つです。また、ほとんどの商用のJava統合開発環境(IDE)と連携することができます。そのため、JBuilder、WebSphere StudioなどJava統合開発環境独自のビルドツールを使用するのではなく、Antを使用することにより、統合開発環境を選ばないビルド環境を作ることができます

 http://ant.apache.org/bindownload.cgiよりAntの最新版をダウンロードします。
 ダウンロードしたファイルを解凍し、任意のディレクトリに配置します。
# cd /usr/local/src
# tar zxvf apache-ant-1.7.1-bin.tar.gz
# mv apache-ant-1.7.1 /usr/local/apache-ant-1.7.1
# ln -sfn /usr/local/apache-ant-1.7.1 /usr/local/ant
 Antを実行するユーザに変更し、環境変数ANT_HOMEを追加します。また、PATHも通しておきます。
$ echo 'export ANT_HOME=/usr/local/ant' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$ANT_HOME/bin' >> ~/.bash_profile
$ source ~/.bash_profile
 全ユーザに対しAntを実行させるのであれば、下記のように環境変数ANT_HOMEを最終行に追加します。また、PATHも通しておきます。
# vi /etc/profile
##### Ant環境設定 #####
export ANT_HOME=/usr/local/ant
export PATH=$PATH:$ANT_HOME/bin
保存後、下記を実行
# source /etc/profile
 "ant -version"コマンドを実行して以下のように表示できたらインストール成功です。(-version オプションをつけてantを実行するとインストールされているantのバージョン情報を表示します)
$ ant -version
Apache Ant version 1.7.1 compiled on June 27 2008
 Antの実行
# ant
Buildfile: build.xml does not exist!
Build failed
 これでインストールの完了です。

antコマンドの使用方法

 ターゲットはビルドファイルに記述したターゲットの名前を指定します。ターゲットを省略した場合はproject要素のdefault属性の値が使用されます。
ant [オプション] [ターゲット [ターゲット2 [ターゲット3] ...]]
 オプションの説明
オプション 説明
-help ヘルプを表示します
-projecthelp プロジェクトのヘルプを表示します
-version バージョン情報を表示します
-diagnostics 現在の実行環境に関する情報を表示します
-quiet , -q メッセージを出力しないようにします
-verbose , -v メッセージをできるだけ出力するようにします
-debug デバック情報を表示します
-emacs 装飾なしのログ情報を生成します
-logfile <file> ,-l <file> ログを出力するファイルを指定します
-logger <classname> ロギングを行うためのクラスを指定します
-listener <classname> プロジェクトリスナーとして追加するクラスのインスタンスを指定します
-buildfile <file> , -file <file> , -f <file> ビルドファイルを指定します
-D<property>=<value> プロパティを設定します
-propertyfile <name> プロパティファイルを指定します
-inputhandler <class> ユーザーからの入力を扱うクラスを指定します
-find <file> ビルドファイルをファイルシステムのルートに向かい検索しそれを使用します


ソースファイルの作成

 ソースファイルの置き場所は下記のとおりとします。作業フォルダの下にsrcフォルダを作成してその下にソースファイルを作成します。
作業フォルダ-|
       +--/src/HelloWorldJavaDoc.java
HelloWorldJavaDoc.java(ここからダウンロード
import java.io.*;
public class HelloWorldJavaDoc {
  /**
   * コメント
   */
  private String comment;
  /**
   * 引数なしのコンストラクタ
   */
  public HelloWorldJavaDoc() {
  }
  /**
   * コメントを引数とするコンストラクタ
   * @param comment コメント
   */
  public HelloWorldJavaDoc(String comment) {
    this.comment = comment;
  }
  /**
   * コメントの取得
   * @return コメントを返す。
   * コメントが設定されていない場合「知らない」を返す。
   */
  public String getComment() {
    if (comment==null) {
      return "知らない";
    }
    return comment;
  }
  /**
   * コメントを設定
   * @param comment コメント
   */
  public void setComment(String comment) {
    this.comment = comment;
  }
  /**
   * コメントを出力ストリームに出力させる。
   * コメントがない場合「知らない」と出力。
   * @param OutputStreamWriterクラス
   * @throws java.io.IOException 入出力エラーが発生した場合にスローされる
   */
  public void sayComment(OutputStreamWriter out) throws IOException {
    if (comment==null) {
      out.write("知らない");
    } else {
      out.write(comment);
    }
  }
}

ビルドファイルの作成

 Antはbuild.xmlという名前のXML形式のファイルに書かれた指示に従って様々な作業を行います。このファイルのことをビルドファイルと呼びます。
 作業フォルダの下にbuild.xmlファイルを作成します。
作業フォルダ-|
       |-/build.xml
       +--src/HelloWorldJavaDoc.java
 ここでは以下の作業を行う設定を記述します。
1.ソースファイルのコンパイル
2.jarファイルの作成
3.javadocの作成
4.生成したファイルの削除

build.xml(ここからダウンロード
<?xml version="1.0" encoding="UTF_8"?>
<project name="javahelloant" default="jar"  basedir=".">
  <!-- ****プロパティ**** -->
  <!-- ソースファイルがあるディレクトリ -->
  <property name="src.dir" value="src"/>
  <!-- クラスファイルを出力するディレクトリ -->
  <property name="classes.dir" value="classes"/>
  <!-- javadocを出力するディレクトリ -->
  <property name="javadoc.dir" value="docs"/>
  <!-- jarファイル名 -->
  <property name="jar.name" value="javahelloant.jar"/>
  <!-- ****ターゲット**** -->
  <!-- jarファイルの作成 -->
  <target name="jar" depends="compile">
    <jar jarfile="${jar.name}" basedir="${classes.dir}"></jar>
  </target>
  <!-- コンパイル -->
  <target name="compile">
    <mkdir dir="${classes.dir}" />
    <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
  </target>
  <!-- javadocの作成 -->
  <target name="javadoc">
    <javadoc destdir="${javadoc.dir}">
      <fileset dir="${src.dir}"/>
    </javadoc>
  </target>
 
  <!-- 生成したファイルやフォルダの削除 -->
  <target name="clean">
    <delete dir="${classes.dir}" />
    <delete dir="${javadoc.dir}" />
    <delete file="${jar.name}" />
  </target>
</project>

コンパイル

 コンパイルを行うにはビルドファイルに記述されたコンパイルを行うターゲットの名前を指定します。
# ant compile
Buildfile: build.xml
compile:
    [javac] Compiling 1 source file to /root/classes
BUILD SUCCESSFUL
Total time: 1 seconds

jarファイルの生成

 jarファイルの生成を行うにはビルドファイルに記述されたjarファイルの生成を行うターゲットの名前を指定します。また、プロジェクトのデフォルトのターゲットがjarファイルの生成になっているのでターゲットを指定しなくてもjarファイルの生成を行います。
# ant jar
Buildfile: build.xml
compile:
jar:
      [jar] Building jar: /root/javahelloant.jar
BUILD SUCCESSFUL
Total time: 0 second
 または
# ant
Buildfile: build.xml
compile:
jar:
      [jar] Building jar: /root/javahelloant.jar
BUILD SUCCESSFUL
Total time: 0 second

javadocの生成

 javadocの生成を行うにはビルドファイルに記述されたjavadocの生成を行うターゲットの名前を指定します。
# ant javadoc
Buildfile: build.xml
javadoc:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 宛先ディレクトリの作成中: "/root/docs/"
  [javadoc] ソースファイル /root/src/HelloWorldJavaDoc.java を読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] 標準 Doclet バージョン 1.5.0_17
  [javadoc] 全パッケージとクラスの階層ツリーを作成しています...
  [javadoc] /root/docs/HelloWorldJavaDoc.html の生成
  [javadoc] /root/src/HelloWorldJavaDoc.java:49:
                警告 - @param の引数 "OutputStreamWriterクラス" がパラメータ名ではありません。
  [javadoc] /root/docs/package-frame.html の生成
  [javadoc] /root/docs/package-summary.html の生成
  [javadoc] /root/docs/package-tree.html の生成
  [javadoc] /root/docs/constant-values.html の生成
  [javadoc] 全パッケージとクラスのインデックスを作成しています...
  [javadoc] /root/docs/overview-tree.html の生成
  [javadoc] /root/docs/index-all.html の生成
  [javadoc] /root/docs/deprecated-list.html の生成
  [javadoc] 全クラスのインデックスを作成しています...
  [javadoc] /root/docs/allclasses-frame.html の生成
  [javadoc] /root/docs/allclasses-noframe.html の生成
  [javadoc] /root/docs/index.html の生成
  [javadoc] /root/docs/help-doc.html の生成
  [javadoc] /root/docs/stylesheet.css の生成
  [javadoc] 警告 1 個
BUILD SUCCESSFUL
Total time: 2 seconds

生成したファイルやフォルダを削除する

 生成したファイルやフォルダの削除を行うにはビルドファイルに記述された生成したファイルやフォルダの削除を行うターゲットの名前を指定します。 コマンドプロンプト
# ant clean
Buildfile: build.xml
clean:
[delete] Deleting directory /root/classes
[delete] Deleting directory /root/docs
[delete] Deleting: /root/javahelloant.jar
BUILD SUCCESSFUL
Total time: 0 second

●8080ポートにlocalhost以外からアクセスできない

 ファイアーウォールの設定で、8080を除外してください。