ページ

2015年5月30日土曜日

Antをちゃんと学ぶ

分かってるようで分かってない「Ant」をちゃんと学ぶ


Antとは・・
  Jakartaプロジェクトで開発されているJavaベースのビルドツール。

・インストールの際に設定しておいた方が良い環境変数

  • ANT_HOME  : Antがインストールされているディレクトリ
  • JAVA_HOME : JDKがインストールされているディレクトリ
  • PATH : Antの実行ファイルの場所を追加


・Antの実行

↓Antの書式  
ant [options] [target [target2 [target3] ...]]
Options:
  -help, -h              ヘルプメッセージを表示します
  -projecthelp, -p       プロジェクトに関する情報を表示します
  -version                Antのバージョンを表示します
  -diagnostics           診断や問題のレポートに役立つ情報を表示します
  -quiet, -q             なるべくメッセージを表示しないでビルドします
  -verbose, -v           詳細な進行状況を表示しながらビルドします
  -debug, -d             デバッグ情報を表示します
  -emacs, -e             装飾なしのログ情報を生成します
  -lib <path>            jarやクラスを検索するパスを指定します
  -logfile <file>        ログを出力するファイルを指定します
    -l     <file>                ''
  -logger <classname>    ログを実行するクラスを指定します
  -listener <classname>  指定したクラスのインスタンスをプロジェクトリスナとして追加します
  -noinput               対話的入力を許可しません
  -buildfile <file>      ビルドファイル名を指定します
    -file    <file>              ''
    -f       <file>              ''
  -D<property>=<value>   プロパティー値を設定します
  -keep-going, -k        失敗したターゲット(複数)に依存しないターゲットを全て実行します
  -propertyfile <name>   全てのプロパティーをファイルからロードします。
                         -Dで指定したプロパティーより優先されます
  -inputhandler <class>  入力リクエストを扱うクラスを指定します
  -find <file>           親ディレクトリを順にたどってビルドファイルを探します
    -s  <file>                   ''
  -nice  number          スレッドの優先順位を指定します
                         1 (低) ~ 10 (高); デフォルト:5 
  -nouserlib             ${user.home}/.ant/lib にあるJARファイルを参照せずに
                         Antを実行します
  -noclasspath           CLASSPATHを参照せずにAntを実行します
  -autoproxy             (Java1.5以上) OSのプロキシ設定を利用します
  -main <class>          Antのノーマルエントリポイントを上書きします
単に「ant」を叩くとカレントディレクトリのbuild.xmlを実行しようとする。
build.xmlを指定する場合は「-buildfile」オプションが必要

・ビルドファイルの構成

大きく分けて「プロジェクト」「ターゲット」「タスク」が必要

例)
<project name="sample_project" default="compile" basedir=".">
  <property name="srcdir" value="./src">
 <target name="compile">
    <!-- ここにコンパイルを実行するタスクを記述 -->
  </target>
  <target name="install" depends="compile">
    <!-- ここにインストールを実行するタスクを記述-->
  </target>
</project>


組み込みプロパティについて
プロパティ名プロパティ値
basedirproject要素のbasedir属性で設定されているベースディレクトリの絶対パス
ant.fileビルドファイルの絶対パス
ant.versionAntのバージョン
ant.project.name現在実行しているプロジェクトの名前
ant.java.versionJava仮想マシンのバージョン
※そのたJavaのSystem.getProperty()メソッドで取得できるプロパティも全て
   組み込みプロパティとして利用可能  例) ${os.name}


ターゲット
属性名説明
必須
nameターゲットの名前。
dependsこのターゲットを実行する前に必ず実行しなければいけないターゲット。カンマで区切って複数指定することができます。
 
ifこのターゲットを実行するために設定されてなければいけないプロパティの名前。もしここで指定したプロパティに何も値が設定されていなければ、ターゲットのタスクは実行はされません。
 
unlessこのターゲットを実行するために設定されていてはいけないプロパティの名前。もしここで指定したプロパティに何か値が設定されていれば、ターゲットのタスクは実行されません。
 
descriptionこのターゲットの機能の簡単な説明。Ant を -projecthelp オプションで起動したときに、ここで指定した説明が表示されます。
 

赤字・・よく使う


・データ構造

データ構造の種類
データ構造説明
Filelistファイル名を列挙することで表現するファイルの集合です。
Filesetパターンやセレクタ等を用いて選択されるファイルの集合です。
Patternsetパターンの集合を表します。
パス類似構造PATHやCLASSPATHを指定するために用いられます。
リソースファイルまたはファイルに似たものを抽象化した概念です。
リソースコレクションリソースの集合です。バージョン1.8以降、FileListなど従来のデータ構造はリソースコレクションの一種という扱いになりました
セレクタFilesetにおいて、ファイル名以外の基準でファイルの集合を選択する場合に用いられます。

パターンセット(PatternSet)
属性名説明必須
includes
集合に含めたい名前のパターン。コンマ区切りまたはスペース区切りで複数のパターンを記述することができます。省略時はすべてのファイルが含まれたとみなされます。
 
includesfile
集合に含めたい名前のパターンを記述したファイル。 
excludes
集合から除外したい名前のパターン。コンマ区切りまたはスペース区切りで複数のパターンを記述することができます。省略時は何も除外されません。 
excludesfile
集合から除外したい名前のパターンを記述したファイル。 
refid
別の場所で定義されたパターンセットを参照するときに用います。参照されるパターンセットは、id属性で名前が定義されていなければいけません。(この表にはid属性を書いていませんが、id属性はすべてのデータ構造要素で用いることができます。) 

ファイルセット(FileSet)
属性名説明初期値必須
dir
ファイル集合のベースディレクトリです。
 
defaultexcludes
デフォルト除外集合をファイル集合から除外するかどうかを指定します。
yes
 
includes
FileSetに含めたいファイルのパターン。
 
 
includesfile
FileSetに含めたいファイルのパターンを記述したファイル。
 
 
excludes
FileSetから除外したいファイルのパターン。
 
 
excludesfile
FileSetから除外したいファイルのパターンを記述したファイル。
 
 
casesensitive
英文字の大文字と小文字を区別するかどうかを指定します。
true
 
followsymlinks
シンボリックリンクをたどるかどうかを指定します。
true
 

・実際にbuild.xmlを書いてみる。

<?xml version="1.0" encoding="UTF-8" ?>
<project name="AntSample" default="release" basedir=".">

    <!-- メインのビルド関連プロパティ -->
    <property name="src" location="${basedir}/src"/>
    <property name="build" location="${basedir}/build"/>

    <!-- テストのビルド関連プロパティ -->
    <property name="test.src" location="${basedir}/test"/>
    <property name="test.build" location="${basedir}/test_build"/>
    <property name="test.report" value="${basedir}/report"/>

    <!-- テスト用クラスパス -->
    <path id="test.classpath">
        <pathelement location="${build}" />
        <pathelement location="${test.build}" />
        <pathelement location="lib/junit.jar" />
    <pathelement location="lib/org.hamcrest.core_1.3.0.v201303031735.jar" />
    </path>

    <!-- 初期化 -->
    <target name="init">
        <!-- Create the time stamp -->
        <tstamp/>
        <mkdir dir="${build}"/>
        <mkdir dir="${test.build}"/>
    <mkdir dir="${test.report}"/>
    </target>

    <!-- コンパイル -->
    <target name="compile" depends="init" description="compile the source " >
        <!-- メインをコンパイル -->
        <javac srcdir="${src}" destdir="${build}" includeAntRuntime="no"/>

        <!-- テストをコンパイル -->
        <javac srcdir="${test.src}" destdir="${test.build}" includeAntRuntime="no">
            <classpath refid="test.classpath" />
        </javac>

    </target>

    <!-- テスト実行 -->
    <target name="test" depends="compile" description="test the source " >

        <!-- レポートファイルを削除 -->
    <delete>
        <fileset dir="${test.report}" includes="TEST-*"/>
    </delete>

        <!-- JUnitによるテストを実行 -->
        <junit fork="yes" haltonfailure="false">
        <classpath refid="test.classpath" />
            <formatter type="xml" usefile="true" />
            <batchtest fork="yes" todir="${test.report}">
                <fileset dir="${test.src}">
                    <include name="**/*Test.java"/>
                </fileset>
           </batchtest>
        </junit>
    </target>

    <!-- リリース -->
    <target name="release" depends="test" description="generate the release files" >
    </target>

    <!-- クリーン -->
    <target name="clean" description="clean up" >
        <delete dir="${build}"/>
        <delete dir="${test.build}"/>
        <delete dir="${test.report}"/>
    </target>

</project>


上記のbuild.xmlでちゃんとビルドできることを確認^^
が、ここでめっちゃハマったポイントがっorz

プロパティでsrc, test.srcを宣言しているが、同ディレクトリでやろうとしていた為
エラーが多発してしまってました。。
また、src, test.srcにjavaファイルまでのフルパスを書いていた為、テスト時にクラスローダーでこけていました。orz
ダメな例) src = “${basedir}/src/main/java”
これでビルドすると main.java.XXXX.classではなくただのXXXX.classになってしまう。

参考URL
http://www.techscore.com/tech/Java/ApacheJakarta/Ant/index/
http://symfoware.blog68.fc2.com/blog-entry-993.html
http://dev.classmethod.jp/etc/jenkins/







0 件のコメント:

コメントを投稿