Ant允許根據(jù)的要求創(chuàng)建自定義組件。 自定義組件可以是條件,過濾器,選擇器等,并在ant核心api之外定義。
自定義組件的行為類似于Ant核心組件。
自定義組件是可以實現(xiàn)類和接口的普通Java類。 它看起來像編寫一個自定義任務(wù),通過setter和getter方法定義屬性。
<typedef>元素用于將自定義組件實現(xiàn)到Ant核心中。
這是一個三階段的過程。 首先創(chuàng)建一個Java類,然后定義<typedef>元素,然后在構(gòu)建文件中使用它。
示例
為條件創(chuàng)建Java類。參考以下代碼:
package com.yiibai;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.condition.Condition;
public class AllUpperCaseCondition implements Condition {
private String value;
// The setter for the "value" attribute
public void setValue(String value) {
this.value = value;
}
// This method evaluates the condition
public boolean eval() {
if (value == null) {
throw new BuildException("value attribute is not set");
}
return value.toUpperCase().equals(value);
}
}
現(xiàn)在通過指定Java類來定義<typedef>。
<typedef name="alluppercase" classname="com.yiibai.AllUpperCaseCondition"
classpath="test.com.yiibai"/>
通過這樣做,已經(jīng)成功創(chuàng)建了一個自定義元素<alluppercase>,它可以在項目中進一步使用。 請參閱build.xml文件。
文件:build.xml -
<project name="java-ant project" default="abc">
<typedef name="alluppercase" classname="com.yiibai.AllUpperCaseCondition"
classpath="test.com.yiibai"/>
<target name="abc" >
<condition property="allupper">
<alluppercase value="THIS IS ALL UPPER CASE"/>
</condition>
</target>
</project>
在上面的例子中,我們創(chuàng)建了一個自定義條件元素?,F(xiàn)在將創(chuàng)建一個自定義選擇器。選擇器是數(shù)據(jù)類型并且要創(chuàng)建自定義選擇器,它必須實現(xiàn)
org.apache.tools.ant.types.selectors.FileSelector接口。 此接口具有單個方法isSeletected(File basedir,String filename,F(xiàn)ile file),必須重寫該方法。 下面給出了自定義選擇器的示例。
Java類
package com.yiibai;
import java.io.File;
import org.apache.tools.ant.types.selectors.FileSelector;
public class JavaSelector implements FileSelector {
public boolean isSelected(File b, String filename, File f) {
return filename.toLowerCase().endsWith(".java");
}
}
類型定義
<typedef name="javaselector" classname="com.yiibai.JavaSelector"
classpath="test"/>
文件:build.xml -
<project name="java-ant project" default="abc">
<target name="abc">
<typedef name="javaselector" classname="com.yiibai.JavaSelector"
classpath="test"/>
<copy todir="destdir">
<fileset dir="src">
<javaselector/>
</fileset>
</copy>
</target>
</project>