Ant将内容发布到不同的位置

时间:2011-11-12 15:22:17

标签: java deployment ant build copy

我有一个java项目和一个ANT脚本来构建,然后使用简单的复制命令将项目分发到其他项目。

我只想在ant脚本的标题中将复制到文件的位置命名为一次,并且对于依赖于此项目的每个项目都没有明确的copy-task。

我在ANT中找不到类似数组的内容,那么将内容分发到多个目录的最简洁方法是什么?

3 个答案:

答案 0 :(得分:1)

我不相信你有很多可行的选择:copy任务只接受一个目录。

  1. 创建自己的复制任务,其中包含目录列表。
  2. 执行执行复制的脚本/程序。
  3. 让子项目进行拉动。
  4. 我真的对将项目推送到其他项目犹豫不决,因为这假设这些项目将与新推出的代码一起使用。 IMO“子”项目应该做出决定,如果他们想要新版本。

    对我而言,这听起来更像是依赖管理问题,使用Ivy / Maven / Gradle(或其他Maven-like)可以更好地处理。

    所有这一切,听起来你想做选项1,创建一个接受目标目录列表的自定义Ant任务;可以很容易地扩展现有的复制任务以获得其所有功能 - 只需添加“todirs”属性。

答案 1 :(得分:1)

您可以考虑在复制任务中使用scriptmapper enablemultiplemappings为真。

首先,列出属性中的目标目录并从中创建filelist。 (您可以使用dirset,但API for filelist更简单。)然后运行副本,并使用scriptmapper设置多个目标。

<property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />    
<filelist id="dests" dir="/" files="${dest.dirs}" />

<copy todir="/" enablemultiplemappings="yes">
    <fileset dir="${srd.dir}" />
    <scriptmapper language="javascript">
        <![CDATA[
            // Obtain a reference to the filelist
            var filelist = project.getReference( "dests" );

            var dests = filelist.getFiles( project );
            for ( var i = 0; i < dests.length; i++ )
            {
                self.addMappedName( dests[i] + "/" + source );
            }
        ]]>
    </scriptmapper>
</copy>

答案 2 :(得分:1)

根据我在Martin的回答中评论的内容,我想将我的解决方案版本作为另一种选择发布。我正在使用Martin的答案中的属性名称来表达清楚。

<target name="deploy" >
    <property name="dest.dirs" value="/dir/one,/dir/two,/dir/thr/ee" />
    <for list="${dest.dirs}" param="dest.dir" parallel="true" delimiter="," >
        <sequential>
            <copy todir="@{dest.dir}" >
                <fileset dir="${srd.dir}" />
            </copy>
        </sequential>
    </for>
</target>

请注意“for”是一个Ant-Contrib任务,它在后面使用Macrodef所以你应该使用@ {}来引用“dest.dir”; “dest.dirs”将被分隔符拆分为一个列表(可能是String [])。这里我们用逗号分割它(默认值为分隔符是逗号)。我还添加了“parallel”以使其同时将文件复制到所有“dest.dirs”,但是,如果要复制的项目很大,则应删除“parallel”。

请检查http://ant-contrib.sourceforge.net/tasks/tasks/for.htmlhttp://ant-contrib.sourceforge.net/tasks/tasks/foreach.html了解更多信息。