Top / Java / Ant / TIPS集

AntのTIPS集

可変ファイル名のファイルを、固定ファイル名のファイルとしてコピーする

日付がついて出力される可変ファイル名の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コマンドから実行する

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

プロパティを上書き

build.xmlには外からプロパティのValueを渡すことができます。たとえば

$ ant -Dproject.name=newProjectname

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

AntでFTPタスクを使用したい

${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日前の日付をプロパティにセットする、とか)

<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>

コンパイル

<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にクラスパスを通す

<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自身が通したクラスパスを無効にする。

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

includeAntRuntime="no"

とすればよい。

AntにVM引数を渡す

環境変数 ANT_OPTS を指定すればよいみたい。例えばJavaのメモリ使用量を設定するには

export ANT_OPTS=-Xmx512m

など。

タスクの一覧表示

>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

外部タスクを使う

${ANT_HOME}/lib/

にjarファイルを置く必要がある。

独自タスクの定義

基本的にはtaskdefタグで行う。下記がサンプル。

<taskdef name="java2html" classname="com.java2html.Java2HTMLTask">
	<classpath>
		<pathelement location="${j2h.jar}" /> 
	</classpath> 上でそのタスクが存在するjarを指定。
</taskdef>

Java2html(旧バージョン)

${j2h.jar}は、j2h.jarを指定(ファイルはhttp://www.java2html.com/より取得)*1

<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>

ディレクトリをいったんとっといて上書きして、処理したら元に戻す

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>

この記事は

選択肢 投票
おもしろかった 20  
そうでもない 10  
  • ant --noconfig てなんだっけ。。。 -- きの? 2006-12-18 09:34:30 (月)
  • こっここっここ -- コッシー? 2010-10-27 (水) 11:52:24

Top / Java / Ant / TIPS集

現在のアクセス:43735


*1 Java2htmlは新しいバージョンができて、Ant用タスクが定義されたりと、上記内容は古いものとなっています。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-14 (火) 10:54:07 (1089d)