Java 如何为ant任务创建嵌套元素?

Java 如何为ant任务创建嵌套元素?,java,ant,build,task,Java,Ant,Build,Task,是否可以为任何ant任务创建嵌套元素。例如 <copy todir="../backup/dir"> <fileset dir="src_dir"/> <filterset> <filter token="TITLE" value="Foo Bar"/> </filterset> </copy> 对于任务copy,我们将嵌套元素设置为filterset。现在,我想为任务复制创建自己的

是否可以为任何ant任务创建嵌套元素。例如

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
      <filter token="TITLE" value="Foo Bar"/>
    </filterset>
</copy>

对于任务copy,我们将嵌套元素设置为filterset。现在,我想为任务复制创建自己的嵌套元素encryptfilterset

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <encryptfilterset>
      <filter token="TITLE" value="Foo Bar"/>
    </encryptfilterset>
</copy>


我们怎么能做到呢

您可以创建自己的宏定义

(这只是一个例子)



我们必须扩展现有任务以创建
CustomTask
,现在要支持自定义嵌套元素XYZ,请在新类中创建一个方法

public XYZ createXYZ()

public void addXYZ(XYZ obj)


public void addXYZ(XYZ obj)



所以我的文件看起来像:-

public class CopyEncrypted extends Copy {   

    public EncryptionAwareFilterSet createEncryptionAwareFilterSet()
    {       
        EncryptionAwareFilterSet eafilterSet = new EncryptionAwareFilterSet();      
        getFilterSets().addElement( eafilterSet );      
        return eafilterSet;
    }   
}


public class EncryptionAwareFilterSet extends FilterSet{

    @Override
    public synchronized void readFiltersFromFile(File file)
            throws BuildException {
        log("EncryptionAwareFilterSet::reading filters",0);
        super.readFiltersFromFile(file);

        Vector<Filter> filts = getFilters();
        for (Iterator iterator = filts.iterator(); iterator.hasNext();) {
            Filter filter = (Filter) iterator.next();
            if ( filter.getToken().equalsIgnoreCase( "PASSWORD" ) ){
                filter.setValue( Encryptor.getEncryptedValue ( filter.getValue() )  );
            }
        }   
    }
}
公共类CopyEncrypted扩展副本{
公共加密WareFilterSet CreateEncryptionWareFilterSet()
{       
EncryptionWareFilterSet eafilterSet=新的EncryptionWareFilterSet();
getFilterSets().addElement(EAFilterSets);
返回eafilterSet;
}   
}
公共类EncryptionWareFilterSet扩展了FilterSet{
@凌驾
公共同步的无效readFiltersFromFile(文件文件)
抛出构建异常{
日志(“EncryptionWareFilterSet::reading filters”,0);
super.readFiltersFromFile(文件);
向量filters=getFilters();
for(Iterator Iterator=filts.Iterator();Iterator.hasNext();){
过滤器过滤器=(过滤器)迭代器。下一步();
if(filter.getToken().equalsIgnoreCase(“密码”)){
filter.setValue(Encryptor.getEncryptedValue(filter.getValue());
}
}   
}
}

build.xml

<target name="encrypted-copy" >
        <CopyEncrypted todir="dist/xyz/config" overwrite="true">
            <fileset dir="config"/>                 
            <encryptionAwareFilterSet>
                <filtersfile file="conf/properties/blah-blah.properties" />
            </encryptionAwareFilterSet>
        </CopyEncrypted>
    </target>

macrodef不是嵌套元素。
public class CopyEncrypted extends Copy {   

    public EncryptionAwareFilterSet createEncryptionAwareFilterSet()
    {       
        EncryptionAwareFilterSet eafilterSet = new EncryptionAwareFilterSet();      
        getFilterSets().addElement( eafilterSet );      
        return eafilterSet;
    }   
}


public class EncryptionAwareFilterSet extends FilterSet{

    @Override
    public synchronized void readFiltersFromFile(File file)
            throws BuildException {
        log("EncryptionAwareFilterSet::reading filters",0);
        super.readFiltersFromFile(file);

        Vector<Filter> filts = getFilters();
        for (Iterator iterator = filts.iterator(); iterator.hasNext();) {
            Filter filter = (Filter) iterator.next();
            if ( filter.getToken().equalsIgnoreCase( "PASSWORD" ) ){
                filter.setValue( Encryptor.getEncryptedValue ( filter.getValue() )  );
            }
        }   
    }
}
<target name="encrypted-copy" >
        <CopyEncrypted todir="dist/xyz/config" overwrite="true">
            <fileset dir="config"/>                 
            <encryptionAwareFilterSet>
                <filtersfile file="conf/properties/blah-blah.properties" />
            </encryptionAwareFilterSet>
        </CopyEncrypted>
    </target>