こちらは「Antの基礎 ②外部ライブラリありの自動ビルド」の続きです。
目次記事はこちらです。
独自タスク
Antタスクは豊富に用意されており、普通に使用する分には困らないと思います。ただ、独自でタスクを作りたい!って時もたまにはあるかもしれないので、独自タスクの作り方くらいは知っておいた方がいい気がします。![]()
Task クラス
インストールした Ant のディレクトリ下にあるlibフォルダを開きます。(前の手順通りならCドライブの下のtoolsディレクトリの中にあります。)
その中にある ant.jar をコピーします。
eclipse の FallModelProject の lib フォルダに、コピーした ant.jar を張り付けてビルドパスに追加します。
Antの独自タスクを作成したい場合、Taskクラス (org.apache.tools.ant.Task) をオーバーライドしたクラスを作成します。
src で右クリック、【新規】→【クラス】をクリックして次のように入力します。
パッケージ:origintask
クラス名 :PracTask
新規作成したPracTaskクラスに次の内容を入力します。
package origintask;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class PracTask extends Task{
private String message;
@Override
public void execute() throws BuildException {
System.out.println("属性messageの入力内容は:" + this.message);
}
public void setMessage(String message) {
this.message = message;
}
}
それぞれの意味について解説します。
import org.apache.tools.ant.Task;
public class PracTask extends Task{ /*~~~~*/ }
独自タスクの作成には最低限 Task クラスを継承する必要があります。
コンストラクタは Task クラスにデフォルトがあるので、継承したオリジナルクラスの方で書く必要はありません。
@Override
public void execute() throws BuildException {
System.out.println("属性messageの入力内容は:" + this.message);
}
executeメソッドは Task クラスにあるメソッドです。Antビルドを実行する際に呼ばれるメソッドです。 今回はシンプルにコンソールに文字を出力するだけにしています。
throws 句にある BuildException クラスは、Ant が提供する例外の型です。Ant ビルドを行った際に生じた例外であることを表します。(後で使ってみます。)
private String message;
public void setMessage(String message) {
this.message = message;
}
タグ内の属性に使用したいものは、属性名の Setter メソッドで実現できます。今回は setMessage メソッド があるので、独自タグの属性に message="xxx" みたいなのを入れることができます。
PracTask クラスを作成することができたら、build.xml に独自タスクを実行するタスクタグを追加します。
初めに build.xml を編集しないで、そのまま compile タスク(またはデフォルトの実行タスク)を実行します。(build.xml を右クリック、【Antビルド】をクリックして、「compile」か「execute」にチェックが付いた状態で【実行】をクリック)
すると、eclipseのコンソールに次のような表示が現れます。
Buildfile: ~\workspace\FallModelProject\build.xml
clean:
[echo] クリーンタスクを実行
[delete] Deleting directory ~\workspace\FallModelProject\target
[mkdir] Created dir: ~\workspace\FallModelProject\target
compile:
[echo] コンパイルタスクを実行
[javac] Compiling 5 source files to ~\workspace\FallModelProject\target
[javac] ノート: クラス・パスに1つ以上のプロセッサが見つかったため、注釈処理が有効化されて
[javac] います。少なくとも1つのプロセッサが名前(-processor)で指定されるか、検索パス
[javac] (--processor-path、--processor-module-path)が指定されるか、注釈処理が明示的に
[javac] 有効化(-proc:only、-proc:full)されている場合を除き、将来のリリースのjavacでは
[javac] 注釈処理が無効化される可能性があります。
[javac] -Xlint:オプションを使用すると、このメッセージを非表示にできます。
[javac] -proc:noneを使用すると、注釈処理を無効化できます。
execute:
[echo] 実行タスクを実行
[java] 物体の自由落下を行います。
[java] 求めるのは「滞空時間」、「物体の終端速度」です。
[java] 各種プロパティは下記の通りです。
[java] 落下場所:地球
[java] 落下物体:1円玉
[java] 物体質量:0.001kg
[java] 高さ :10.000m
[java] -------------------------------
[java] 終端速度:14.005
[java] 滞空時間:1.428
BUILD SUCCESSFUL
Total time: 1 second
compile タスクが実行されると、target フォルダに PracTask.class が追加されたことが確認できます。
これで独自タスクを利用する準備が整いました。build.xml に次の文を追加します。(クリーンタスクの上あたりに追記しましょう)
<!-- 独自タスクタグ名の定義、読み込み -->
<taskdef name="original" classname="origintask.PracTask" classpath="${build.dir}" />
<!-- 独自タスク -->
<target name="practask">
<original message="HELLO ORIGINAL ANT TASK!" />
</target>
taskdef タグは新たなタスクを定義するタグです。
-
name属性で指定した名前が、その build.xml 内で使用できるタグの名前になります -
classname属性で自作の Task クラスを指定します -
classpath属性で自作の Task クラスがある場所を指定します
では、実際に実行してみます。build.xmlを右クリック、【Antビルド】から、practask にチェックがついている状態で実行します。
practask:
[original] 属性messageの入力内容は:HELLO ORIGINAL ANT TASK!
BUILD SUCCESSFUL
Total time: 334 milliseconds
自作タスクをもう少し!
これで簡単な自作タスクを作ることはできましたが、さすがにこれだけでは弱すぎるのでもう一つくらいの具体例とともにほんの少し深堀します。
ファイル一覧を表示するタスク
「build.xmlと同じ階層のすべてのファイルを表示する」タスクを作成します。PracTask.javaがあるのと同じパッケージで、新規にクラスを作成してください。
クラス名:FilesTask
package origintask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
public class FilesTask extends Task{
private static final String win = "Windows";
private static final String lin = "Linux";
public static class OSSelecter extends EnumeratedAttribute{
@Override
public String[] getValues() {
return new String[] { win, lin };
}
}
protected OSSelecter oss;
public void setOss(OSSelecter oss) {
this.oss = oss;
}
@Override
public void execute() throws BuildException {
validate();
String[] filesCommand = switch (this.oss.getValue()) {
case win -> new String[] {"cmd.exe", "/c", "dir"};
case lin -> new String[] {"ls"};
default -> null;
};
ProcessBuilder builder = new ProcessBuilder(filesCommand);
Process process;
try {
process = builder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
process.waitFor();
} catch (IOException | InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
protected void validate() throws BuildException {
if (oss == null) {
throw new BuildException("oss属性を指定してください");
}
if(!(oss.equals(lin) || oss.equals(win))) {
throw new BuildException("oss属性にはWindowsかLinuxを指定してください");
}
}
}
この Task は oss 属性で "Windows" か "Linux" を選択させて、ファイル一覧をコンソールに表示するものです。新しく出てきたものを見ていきます。
private static final String win = "Windows";
private static final String lin = "Linux";
public static class OSSelecter extends EnumeratedAttribute{
@Override
public String[] getValues() {
return new String[] { win, lin };
}
}
EnumeratedAttribute クラスは、決まった属性値だけを選択させたい場合に利用します。getValues メソッドをオーバーライドして、そのメソッドの戻り値である String 型配列のデータが、属性で選択できる値になります。
ちなみに Linux の方では試してないので動かないかも。
protected void validate() throws BuildException {
if (oss == null) {
throw new BuildException("oss属性を指定してください");
}
if(!(oss.equals(lin) || oss.equals(win))) {
throw new BuildException("oss属性にはWindowsかLinuxを指定してください");
}
}
validate メソッドでは属性で指定された値の精査を行っています。属性が指定されない場合、または"Windows" か "Linux" 以外の属性値が指定された場合、BuildException が送出されます。このメソッドはオーバーライドしているわけではないので任意のメソッド名で問題ありません。
実際のところ...
Ant で自作タスクを作ることなんてほぼない!
次の記事





