#topicpath
----
**AntのTIPS集 [#zfe6185a]
#contents

***可変ファイル名のファイルを、固定ファイル名のファイルとしてコピーする [#b39cc8ea]
日付がついて出力される可変ファイル名のjarファイルを、SNAPSHOTという固定ファイル名のjarにリネームしたい。

 <copy tofile="target/hogehogelib-SNAPSHOT.jar">
   <fileset dir='target' includes="hogehogelib-*.jar" excludes="hogehogelib-*sources.jar,hogehogelib-SNAPSHOT.jar,hogehogelib-SNAPSHOT-source.jar"/>
 </copy>

target内にある hogehogelib-*.jar ていう名前のファイルを target/hogehogelib-SNAPSHOT.jar という名前にリネームしています。excludesは任意です。ココではさほど意味なし。

おなじファイルセットでDeleteすれば、リネーム完了。



***AntをJavaコマンドから実行する [#se1d11d5]
Antのカスタムクラスをブレークポイントなどを使ってDebugしたくて、EclipseのJavaアプリ実行で実行できる方法を探してましたが、見つかりました。


-Javaの実行で、メインクラス名を
 org.apache.tools.ant.Main
にする
-実行のプリファレンスページでクラスパスにant-launcher.jarをとおす
-プログラムの引数にターゲット名を指定する


でいけますね。ブレークポイントが使えるのは非常に便利!
http://www.ingrid.org/jajakarta/ant/ant-1.2/docs-ja/index.html



***プロパティを上書き [#b9568c46]
build.xmlには外からプロパティのValueを渡すことができます。たとえば
 $ ant -Dproject.name=newProjectname
とすれば、build.xml内の${project.name}を「newProjectname」という値にすることができます。build.xml内でpropertiesファイルで値を設定したりしていても、引数で渡す値の方が優先されるようです。ようするにプロパティを引数で上書き可能ということですね。

*** AntでFTPタスクを使用したい [#wbf21321]
${ant_home}/lib/ に以下のライブラリを入れる必要があります。
 ant 1.5 まではNetComponent.jar
 ant 1.6 からはcommons-net-1.2.2.jar
1.6.1を使ってるのにNetComponentを配置して、うごかねーって思ってたら、必要ライブラリが変わったんですね。

で実際のタスクの書き方は、
 <target name="cvs.ftp" depends="init">
   <ftp server="[ホスト名]"
     remotedir="[サーバのディレクトリ]"
     userid="xxxx"
     password="xxxx" >
     <fileset dir="${report.root}">
       <include name="changelog.html" />
     </fileset>
   </ftp>
 </target>
てな感じ。


***日付処理(n日前の日付をプロパティにセットする、とか) [#u2fa543f]
 <tstamp>
  <format property="TODAY" pattern="yyyy/MM/dd" />
 </tstamp>
 
 <!-- 7日前/10日後を定義する処理 -->
 <propertyfile file="date.properties">
   <entry key = "TODAY-7" type = "date" value = "7"  default = "${TODAY}" pattern = "yyyy/MM/dd" operation = "-" />
   <entry key = "TODAY+10" type = "date" value = "10"  default = "${TODAY}" pattern = "yyyy/MM/dd" operation = "+" />
 </propertyfile>
 <property file="date.properties" />
 <delete file="date.properties" />

もっとスマートなやり方がありました。
 <tstamp>
   <format property="TODAY" pattern="yyyy/MM/dd"/>
   <!-- 7日前/10日後を定義する処理 -->
   <format property="TODAY-n" pattern="yyyy/MM/dd" offset="-${cvs.num}"/>
   <format property="TODAY+10" pattern="yyyy/MM/dd" offset="10"/>
   <format property="lastModified" pattern="yyyy/MM/dd HH:mm:ss"/>
 </tstamp>

***コンパイル [#bba0e48f]
 <target name="javac" depends="init">
  <mkdir dir="${class.dir}" />
  <javac srcdir="${src.dir}" destdir="${class.dir}" encoding="${compile.encoding}" 
 memoryInitialSize="256M" fork="yes" memoryMaximumSize="256M">
   <!-- usage : excludes="kino/hoge.org/**" -->
   <classpath refid="project.class.path" />
  </javac>
 </target>
ちなみにクラスパスなどは
 <path id="project.class.path">
  <pathelement path="${java.class.path}" />
  <pathelement path="${class.dir}" />
  <pathelement path="${jar.dir}" />
 
  <pathelement location="${log.jar}" />
  <pathelement location="${swt.jar}" />
 </path>
とかすればよい。

***ディレクトリ配下のすべてのjarにクラスパスを通す [#rf0699bf]
 <path id="all.classes">
  <fileset dir="${jar.dir}">
   <include name="**/*.jar"/>
  </fileset>
 </path>
といった書き方をすると、
 <!-- Javaテストプログラムの実行 -->
 <target name="java" depends="javac">
  <java classname="kino.test.TestApp2" fork="yes" maxmemory="256M" >
   <arg line="hogehoge" />
   <classpath refid="all.classes" />
  </java>
 </target>
と書くことができる。こうするとすべてのjarファイルにクラスパスを通したことになる。

*** javacタスクで、Ant自身が通したクラスパスを無効にする。 [#b6e66809]
題名の通り、デフォルトは有効なので(ようするにxercesImpl.jarなどは、${ANT_HOME}/lib/にあるため、クラスパスを通さなくてもコンパイルエラーにならない)
それを無効にする方法。javacタスクのオプションで
 includeAntRuntime="no"
とすればよい。

***AntにVM引数を渡す [#ua9bb3b8]
環境変数 ANT_OPTS を指定すればよいみたい。例えばJavaのメモリ使用量を設定するには
 export ANT_OPTS=-Xmx512m
など。


***タスクの一覧表示 [#k931a9c8]
 >ant -projecthelp
とすると、プロジェクトの一覧が表示される。以下が結果
 Buildfile: build.xml
 
          moneytest build file
 
 Main targets:
 
 
 Subtargets:
 
  clean
  clover.view
  code
  hist.report
  record.point
  report.html
  test
  with.clover
 
 Default target: code


***外部タスクを使う [#s94dc94e]
 ${ANT_HOME}/lib/
にjarファイルを置く必要がある。

***独自タスクの定義 [#k87e203e]
基本的にはtaskdefタグで行う。下記がサンプル。
 <taskdef name="java2html" classname="com.java2html.Java2HTMLTask">
 	<classpath>
 		<pathelement location="${j2h.jar}" /> 
 	</classpath> 上でそのタスクが存在するjarを指定。
 </taskdef>



***Java2html(旧バージョン) [#y9111d4a]
${j2h.jar}は、j2h.jarを指定(ファイルはhttp://www.java2html.com/より取得)((Java2htmlは新しいバージョンができて、Ant用タスクが定義されたりと、上記内容は古いものとなっています。))

 <target name="j2h" depends="javac">
 	<mkdir dir="${j2h.dir}"/>
 	<java classname="j2h" fork="yes" maxmemory="256M" >
 		<arg line="-js ${src.dir} -d ${j2h.dir} -t 2 -m 4" />
 		<classpath>
 			<pathelement location="${j2h.jar}" />
 		</classpath>
 	</java>
 </target>

***ディレクトリをいったんとっといて上書きして、処理したら元に戻す [#eb22e204]
newDir -> oldDir へファイルをコピーして、なんか処理。
で、もとに戻すビルドファイル。一度、環境固有の設定情報に書きかえてビルドして、終わったら元通りにしたい、、なんて場合があったので。。

build.win.properties
 source.dir=./src/newDir
 dest.dir=./src/oldDir
 tmp.dir=./tmp

build.xml
 <?xml version='1.0' encoding='UTF-8'?>
 <project name='project' default='backup'>
	<!--
		backup -> copy ->  .... build -> restore
	-->
	<property file="build.win.properties"/>
 
	<target name='backup'>
		<copy todir='${tmp.dir}' overwrite="true" preservelastmodified='true'>
			<fileset dir='${dest.dir}'  defaultexcludes="no"  />
		</copy>
	</target>
 
	<target name='copy'>
		<copy todir='${dest.dir}' overwrite="true"  preservelastmodified='true'>
			<fileset dir='${source.dir}' excludes="**/**.svn"/>
		</copy>
	</target>
 
	<target name='restore'>
		<delete dir="${dest.dir}"/>
		<copy todir='${dest.dir}' overwrite="true"  preservelastmodified='true' >
			<fileset dir='${tmp.dir}' defaultexcludes="no"  />
		</copy>
		<delete dir="${tmp.dir}"/>
	</target>
 </project>


----
この記事は
#vote(おもしろかった[18],そうでもない[10])
#vote(おもしろかった[19],そうでもない[10])
-ant --noconfig てなんだっけ。。。 -- [[きの]] &new{2006-12-18 09:34:30 (月)};
- こっここっここ -- [[コッシー]] &new{2010-10-27 (水) 11:52:24};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS