【備忘録】Eclipseで動的WebをAntビルドしてWARを作る

# 概要
前回の備忘録（下記）に続いて、Antビルドをしてwarファイルを作ってみます。

https://qiita.com/TAKANEKOMACHI/items/ed84bfb1fa54765e47b2

# 手順1:Antビルドファイルを作成する
まずは、この状態であること（前回の続き）から確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/0a1998ae-17e4-5644-0223-720053daf24d.png)

プロジェクトを選択して右クリックし、「エクスポート」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/6cd654d8-46f9-db56-2f93-0c5d5d76d201.png)
「一般」-「Antビルドファイル」を選択して「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/1477a73c-0b51-ec0b-8c74-c67b22e79c47.png)
初期状態ではプロジェクトが何も選択されていないので、対象のプロジェクトにチェックを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f4c6aff3-e44f-818e-3e97-608552388ba7.png)
「完了」ボタンを押して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/39f10049-6413-3b46-0f22-0651d0adb326.png)
作成されると、ルートに「build.xml」が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/02da77e7-5149-d0e7-dd0e-532f03d0b0ec.png)

# 手順2:build.xmlの中身を確認する
build.xmlを開くと下記のように自動的にプロジェクトから内容を生成してくれます。
```
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
              Any modifications will be overwritten.
              To include a user specific buildfile here, simply create one in the same
              directory with the processing instruction <?eclipse.ant.import?>
              as the first entry and export the buildfile again. -->
    <project basedir="." default="build" name="SampleProject">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="17"/>
    <property name="source" value="17"/>
    <path id="サーバー・ランタイム [Tomcat9 (Java17)].libraryclasspath">
        <pathelement location="../../tomcat/9/lib/annotations-api.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ant.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ha.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ssi.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-storeconfig.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-tribes.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina.jar"/>
        <pathelement location="../../tomcat/9/lib/ecj-4.20.jar"/>
        <pathelement location="../../tomcat/9/lib/el-api.jar"/>
        <pathelement location="../../tomcat/9/lib/jasper-el.jar"/>
        <pathelement location="../../tomcat/9/lib/jasper.jar"/>
        <pathelement location="../../tomcat/9/lib/jaspic-api.jar"/>
        <pathelement location="../../tomcat/9/lib/jsp-api.jar"/>
        <pathelement location="../../tomcat/9/lib/servlet-api.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-api.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-coyote.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-dbcp.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-cs.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-de.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-es.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-fr.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ja.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ko.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-pt-BR.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ru.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-zh-CN.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-jdbc.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-jni.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-util-scan.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-util.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-websocket.jar"/>
        <pathelement location="../../tomcat/9/lib/websocket-api.jar"/>
    </path>
    <path id="Web App ライブラリー.libraryclasspath"/>
    <path id="EAR ライブラリー.libraryclasspath"/>
    <path id="SampleProject.classpath">
        <pathelement location="build/classes"/>
        <pathelement location="build/test-classes"/>
        <path refid="サーバー・ランタイム [Tomcat9 (Java17)].libraryclasspath"/>
        <path refid="Web App ライブラリー.libraryclasspath"/>
        <path refid="EAR ライブラリー.libraryclasspath"/>
    </path>
    <target name="init">
        <mkdir dir="build/classes"/>
        <mkdir dir="build/test-classes"/>
        <copy includeemptydirs="false" todir="build/classes">
            <fileset dir="src">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
        <copy includeemptydirs="false" todir="build/test-classes">
            <fileset dir="test">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="clean">
        <delete dir="build/classes"/>
        <delete dir="build/test-classes"/>
    </target>
    <target depends="clean" name="cleanall"/>
    <target depends="build-subprojects,build-project" name="build"/>
    <target name="build-subprojects"/>
    <target depends="init" name="build-project">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="build/classes" includeantruntime="false" source="${source}" target="${target}">
            <src path="src"/>
            <classpath refid="SampleProject.classpath"/>
        </javac>
        <javac debug="true" debuglevel="${debuglevel}" destdir="build/test-classes" includeantruntime="false" source="${source}" target="${target}">
            <src path="test"/>
            <classpath refid="SampleProject.classpath"/>
        </javac>
    </target>
    <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
    <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
        <copy todir="${ant.library.dir}">
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </copy>
        <unzip dest="${ant.library.dir}">
            <patternset includes="jdtCompilerAdapter.jar"/>
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </unzip>
    </target>
    <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>
    </target>
</project>
```

ただ、この初期状態ではいろいろ「足りない」ので、Antのリファレンスを見ながら編集していきます。

ちなみにAntのリファレンスは下記です。

https://www.ne.jp/asahi/hishidama/home/tech/ant/index.html

https://www.masatom.in/pukiwiki/Java/Ant/TIPS%25BD%25B8/

# 手順3:build.xmlを編集する

## propertiesファイルを作成してリンクする
Pleiadesを使用していることもありますが、基本的に「変数」はbuild.xml内に書きたくないので変数はpropertiesに外出しします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/3468775d-88c5-580e-eb65-a17fb694425e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f95c906c-733d-c010-0674-93234eb65cd1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f417aef1-dc35-da05-df77-7a7b66a94551.png)

build.xmlにbuild.propertiesのインポート設定をします
```diff:build.xml
...
<project basedir="." default="build" name="SampleProject">
+	<property file="build.properties" />
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
...
```

## Tomcatライブラリの読み込みを簡潔にする
初期状態だと、動かすTomcatのバージョンを変えてもTomcat9のライブラリを見に行くし、jarが個別指定なので面倒です。
```build.xml
    <path id="サーバー・ランタイム [Tomcat9 (Java17)].libraryclasspath">
        <pathelement location="../../tomcat/9/lib/annotations-api.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ant.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ha.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-ssi.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-storeconfig.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina-tribes.jar"/>
        <pathelement location="../../tomcat/9/lib/catalina.jar"/>
        <pathelement location="../../tomcat/9/lib/ecj-4.20.jar"/>
        <pathelement location="../../tomcat/9/lib/el-api.jar"/>
        <pathelement location="../../tomcat/9/lib/jasper-el.jar"/>
        <pathelement location="../../tomcat/9/lib/jasper.jar"/>
        <pathelement location="../../tomcat/9/lib/jaspic-api.jar"/>
        <pathelement location="../../tomcat/9/lib/jsp-api.jar"/>
        <pathelement location="../../tomcat/9/lib/servlet-api.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-api.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-coyote.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-dbcp.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-cs.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-de.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-es.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-fr.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ja.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ko.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-pt-BR.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-ru.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-i18n-zh-CN.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-jdbc.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-jni.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-util-scan.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-util.jar"/>
        <pathelement location="../../tomcat/9/lib/tomcat-websocket.jar"/>
        <pathelement location="../../tomcat/9/lib/websocket-api.jar"/>
    </path>
```

```build.xml
    <path id="サーバー・ランタイム [Tomcat (Java)].libraryclasspath">
        <fileset dir="${tomcatdir}/lib">
            <include name="*.jar" />
        </fileset>
    </path>
```

```build.properties
tomcatdir=../../../tomcat/9
```

## JUnit用の設定を削除しておく
```diff:build.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
              Any modifications will be overwritten.
              To include a user specific buildfile here, simply create one in the same
              directory with the processing instruction <?eclipse.ant.import?>
              as the first entry and export the buildfile again. -->
<project basedir="." default="build" name="SampleProject">
	<property file="build.properties" />
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="17"/>
    <property name="source" value="17"/>
    <path id="サーバー・ランタイム [Tomcat (Java)].libraryclasspath">
        <fileset dir="${tomcatdir}/lib">
            <include name="*.jar" />
        </fileset>
    </path>    
    <path id="Web App ライブラリー.libraryclasspath"/>
    <path id="EAR ライブラリー.libraryclasspath"/>
    <path id="SampleProject.classpath">
        <pathelement location="build/classes"/>
-        <pathelement location="build/test-classes"/>
        <path refid="サーバー・ランタイム [Tomcat9 (Java17)].libraryclasspath"/>
        <path refid="Web App ライブラリー.libraryclasspath"/>
        <path refid="EAR ライブラリー.libraryclasspath"/>
    </path>
    <target name="init">
        <mkdir dir="build/classes"/>
-        <mkdir dir="build/test-classes"/>
        <copy includeemptydirs="false" todir="build/classes">
            <fileset dir="src">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
-        <copy includeemptydirs="false" todir="build/test-classes">
-            <fileset dir="test">
-                <exclude name="**/*.launch"/>
-                <exclude name="**/*.java"/>
-            </fileset>
-        </copy>
    </target>
    <target name="clean">
        <delete dir="build/classes"/>
-        <delete dir="build/test-classes"/>
    </target>
    <target depends="clean" name="cleanall"/>
    <target depends="build-subprojects,build-project" name="build"/>
    <target name="build-subprojects"/>
    <target depends="init" name="build-project">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="build/classes" includeantruntime="false" source="${source}" target="${target}">
            <src path="src"/>
            <classpath refid="SampleProject.classpath"/>
        </javac>
-        <javac debug="true" debuglevel="${debuglevel}" destdir="build/test-classes" includeantruntime="false" source="${source}" target="${target}">
-            <src path="test"/>
-            <classpath refid="SampleProject.classpath"/>
-        </javac>
    </target>
    <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
    <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
        <copy todir="${ant.library.dir}">
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </copy>
        <unzip dest="${ant.library.dir}">
            <patternset includes="jdtCompilerAdapter.jar"/>
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </unzip>
    </target>
    <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>
    </target>
</project>
```
## initにひと手間
init時にbuildnumberとtimestampを設定しておきます。
MANIFEST内に入れるときに使います。
```diff:build.xml
    <target name="init">
+        <buildnumber/>
+        <tstamp>
+            <format property="timestamp" pattern="yyyy/MM/dd HH:mm:ss" />
+        </tstamp>
        <mkdir dir="build/classes"/>
        <copy includeemptydirs="false" todir="build/classes">
            <fileset dir="src">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
```

## WARの出力先を設定する
Antビルドを実行した際にWARファイルを作成する場合の出力先を考えます。
まぁ、直下に「war」フォルダを作って、そこに出力ということで、、、
う～ん、どうせならwarを作る際の作業領域として設定してしまうか。

```diff:build.properties
+ PROJECT_NAME=SampleProject
+ VENDOR=John Smith
+ workdir=./war
tomcatdir=../../../tomcat/9
```

build.xml側は、ちょっと色々改変が必要です。
なぜなら「build」したら「作成」するけど「clean」したら消すのがお作法だから。
とりあえず、面倒なのでwarフォルダを削除するものを定義します。
（あとは、必要なところでdependsに追加して実行する）

```
    <!-- CLEAN WAR FOLDER-->
    <target name="clean_war">
        <delete dir="${workdir}/${PROJECT_NAME}"/>
    </target>
```

続いて、warを作成する際にwarに含めるものをかき集めるものを定義します。
かき集めるのは、まずビルドされた「build/classes」の中身と、「WebContent」の中のものです。
```
    <!--   ITITIALIZE MAKE WAR    -->
    <target depends="clean_war" name="init_war">
        <mkdir dir="${workdir}/${PROJECT_NAME}/WEB-INF"/>
        <mkdir dir="${workdir}/${PROJECT_NAME}/WEB-INF/classes" />
        <mkdir dir="${workdir}/${PROJECT_NAME}/WEB-INF/lib" />
        <copy todir="${workdir}/${PROJECT_NAME}/">
            <fileset dir="WebContent">
                <exclude name=".git" />
                <exclude name="WEB-INF/web.xml" />
            </fileset>
        </copy>
        <copy todir="${workdir}/${PROJECT_NAME}/WEB-INF/classes">
            <fileset dir="build/classes">
                <exclude name="log4j*.xml"/>
            </fileset>
        </copy>
        <copy file="WebContent/WEB-INF/web.xml" tofile="${workdir}/${PROJECT_NAME}/WEB-INF/web.xml"/>
    </target>

    <!--   MAKE WAR FILE          -->
    <target depends="build-project,init_war" name="make-war">
        <jar jarfile="${workdir}/${PROJECT_NAME}.war" basedir="${workdir}/${PROJECT_NAME}">
            <manifest>
                <attribute name="Author" value="${user.name}"/>
                <section name="Shared">
                    <attribute name="Title" value="${PROJECT_NAME}" />
                    <attribute name="Vendor" value="${VENDOR}" />
                    <attribute name="Build" value="${build.number}"/>
                    <attribute name="Date" value="${timestamp}"/>
                </section>
                <section name="Copyright">
                    <attribute name="Copy" value="${VENDOR}" />
                </section>
            </manifest>
        </jar>
    </target>
```

# 手順4:warファイルを作成する
それでは、build.xmlを選択して右クリックしていきます。
「2 Antビルド」を実行すると「build」されるだけなので「3 Antビルド...」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/d1baa65e-5bbb-2042-8722-cfb242fd00b3.png)

そうすると、下記のように定義されているnameを一覧で列挙してくれます。
今回作成した3つも末尾に追加されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/0e1c1452-8940-1385-900d-60c351c2144d.png)

通常だと「build」を実行することになっているので「make_war」にのみチェックをつけて実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/3fbd91db-23c9-9854-8150-0d62e8e3fb9c.png)

コンソールに処理ログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/84591008-db4c-a1cd-32f9-924f7f629ed9.png)

エクスプローラで確認してみます。
一応、warが出来てますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/2d77fbab-fcbb-1b71-32e7-b9ab4d494361.png)

warファイルの中身も、想定されているような状況、、、、っぽいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/77c0aeda-f46d-5732-599c-79e8a59e0617.png)

MANIFEST内もそれなりに書かれてますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/4929f0a5-973b-6797-0446-4ef23f548ae6.png)

とりあえず、これでwarができたので、Apache/Tomcatのサーバにポイっと置いて動くのを確認することができれば、あとは改変、改変でいけますね。