Antでwarファイルを作成するJavaTips 〜Apache/Jakarta編

» 2004年12月21日 10時00分 公開
[青木淳夫@IT]

 Javaで作成したアプリケーションを配布する場合には、実行に必要なファイルをまとめてアーカイブします。例えば、Javaアプリケーションであればjar形式のファイルに圧縮しますし、Webアプリケーションであればwar形式のファイルに圧縮します(war形式のファイルに関する詳細は、「Eclipseで.warファイルを作成する」)が詳しいので、合わせて参照してください)。

 本TIPSでは、Antでwarファイルを作成する際に使用するjarタスクとwarタスクについて説明します。

設定内容

(1)アーカイブするフォルダ

 今回のサンプルでは、下記のような「Antでファイル操作を行う」で構成したStrutsベースのシンプルなWebアプリケーションをアーカイブします。

画面

 sampleappフォルダをアーカイブし、プロジェクト直下にsampleapp.warと呼ばれるファイルを作成します。

(2)jarタスクでwarファイルを作成する

 warファイルを作成するには、以下のようにbuild.xmlに記述します。

build.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="project" default="dist" basedir=".">

  <!-- warファイルの設定 -->
  <property name="war.home" value="." />
  <property name="web-app.name" value="sampleapp" />

  <!-- jarタスクによってwarファイルを作成 -->

  <target name="dist" >
    <jar destfile="${war.home}/${web-app.name}.war"
         basedir="${web-app.name}" />
  </target>
</project>


 この例では、distターゲットを使いwarファイルを作成しています。jarタスクのdestfile属性に出力するファイル名、basedir属性にアーカイブするディレクトリを指定します。

 Antを実行すると、プロジェクト直下にsampleapp.warが作成されていることが確認できると思います。warファイル(jarファイル)はzip形式で圧縮されるので、市販の圧縮解凍ツールを使用することで、ファイルの内容を確認することができます。

画面

 なお、Antでは下記のjarコマンドと同じ処理が実行されています。

>cd project_root(プロジェクトのルートフォルダに移動した後)
>C:\java\j2sdk1.4.2\bin(JAVA_HOMEのbinフォルダ)\ jar cvf ..\sampleapp.war -C sampleapp/ .


(3)warタスクでwarファイルを作成する

 warタスクはwarファイル独自のフォルダ構成(WEB-INF等)を処理するために、jarタスクを拡張したものです。先ほどの処理をwarタスクで書き換えてみます。

  <!-- warタスクによってwarファイルを作成 -->
  <target name="dist">
    <war destfile="${war.home}/${web-app.name}.war"
           webxml="${web-app.name}/WEB-INF/web.xml">
      <fileset dir="${web-app.name}" excludes="**/web.xml" />
    </war>
  </target>


 warタスクではwebxml属性にてweb.xmlの場所を明示的に指定する必要があります。また、WEB-INF配下にすでにweb.xmlが存在している場合は、警告メッセージが出力されるためexcludes属性にて除外設定をしています。

(4)warタスクを使用するメリット

 ただ、上記の例では、warタスクを利用するメリットが少ないように思われたかもしれません。jarタスクで十分まかなえるのに、なぜあえてwarタスクが用意されているのでしょうか。

 warタスクでは下記の例のように、lib、classes、webinfといった子要素(配下タグ)を使用して、ファイルの配置場所を容易に指定することができます。

  <!-- warタスクの子要素指定の例 -->
  <target name="dist">
    <war destfile="${war.home}/${web-app.name}.war"
           webxml="${web-app.name}/WEB-INF/web.xml">
      <fileset dir="${web-app.name}" excludes="**/web.xml" />
      <!-- 設定ファイルをWEB-INFフォルダの下に配置 -->
      <webinf dir="${struts.dir}" includes="*.xml"/>
      <!-- 外部ライブラリファイルをWEB-INF/libフォルダの下に配置 -->
      <lib dir="${struts.dir}" includes="*.jar"/>
      <lib file="${log4j.jar}"/>
      <!-- ビルドしたclassファイルをWEB-INF/classesフォルダに配置 -->
      <classes dir="${build.dir}/web/classes"/>
    </war>
  </target>


 このようにwarタスクではwarファイルの特別なフォルダ構成を簡易に取り扱うことができるというメリットがあります。既存のファイルをアーカイブするだけの簡単な処理であればjarタスクで問題ありませんが、複雑な構成の場合にはwarタスクを使用することをお勧めします。

Profile

WINGSプロジェクト

青木淳夫


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。