我有一个ant任务,我想从foreach循环调用如下:
<target name="iteratorTarget">
<foreach target="copynow" param="some.location">
<path refid="some.classpath"/>
</foreach>
</target>
<target name="copynow">
<!-- Do some regex related operations -->
<propertyregex property="from.directory" input="${some.location}" select="1"/>
<copy file="${from.directory}" todir="${dest.dir}"/>
</target>
正如您在上面的代码中看到的,我从foreach传递的一个参数是some.location
。现在我想传递另一个参数dest.dir
,我在上面代码的最后第二行中使用过。
那么,我如何将多个参数(在我的情况下是some.location
和dest.dir
)从我在上面的代码中定义的foreach
传递到copynow
目标。
编辑
这是我问题的更多细节。首先是一些前提:
基本上,我有一个类路径文件,其中定义了jar位置列表。例子——
direc1/subdir1/somejar1.jar
direc2/subdir2/somejar2.jar
direc3/subdir3/somejar3.jar
从上面的信息中,我想确保当一个jar被复制到一个给定的dest时,它的等效许可证也被复制到一个给定的dest。
许可证的存储方式如下-
direc1/subdir1/license/license*.txt
direc2/subdir2/license/license*.txt
direc3/subdir3/license/license*.txt
我想在这里实现的是,我想迭代类路径条目,然后使用regex,获得目录直到subdir
。例如'direc1/subdir1',然后我将license
附加到获得的正则表达式并复制该文件夹中存在的所有文件,然后我将jar复制到所需的目的地。
唯一保留的是复制目标目录不是恒定的,并且会变化。因此,我想以某种方式将复制目标目录作为参数发送给copynow
target.Help!
我使用ivy来管理我的构建依赖。可以调整此工具以将本地目录转换为存储库。尽管这个解决方案看起来更复杂(事实也是如此),但它使用工件模式将源文件与它们最终被复制的位置解耦。
在正确配置后,可以使用ivy检索任务,将它们放置在构建工作区中。下面的命令将文件保存在"target"子目录中:
<target name="build" depends="resolve">
<ivy:retrieve pattern="target/[organisation]/[artifact][revision].[ext]" conf="compile"/>
<ivy:retrieve pattern="target/[organisation]/[artifact]" conf="licence"/>
</target>
<标题> 例子├── build.xml
├── ivysettings.xml
├── ivy.xml
├── repo
│ ├── direc1
│ │ └── subdir1
│ │ ├── licence
│ │ │ └── licenceOne.txt
│ │ └── somejar1.jar
│ ├── direc2
│ │ └── subdir2
│ │ ├── licence
│ │ │ └── licenceTwo.txt
│ │ └── somejar2.jar
│ └── direc3
│ └── subdir3
│ ├── licence
│ │ └── licenceThree.txt
│ └── somejar3.jar
└── target
├── myOrg1
│ ├── licenceOne.txt
│ └── somejar1.jar
├── myOrg2
│ ├── licenceTwo.txt
│ └── somejar2.jar
└── myOrg3
├── licenceThree.txt
└── somejar3.jar
build . xml
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<available classname="org.apache.ivy.Main" property="ivy.installed"/>
<target name="resolve" depends="install-ivy">
<ivy:resolve/>
</target>
<target name="build" depends="resolve">
<ivy:retrieve pattern="target/[organisation]/[artifact][revision].[ext]" conf="compile"/>
<ivy:retrieve pattern="target/[organisation]/[artifact]" conf="licence"/>
</target>
<target name="clean">
<delete dir="target"/>
<ivy:cleancache/>
</target>
<target name="install-ivy" description="Install ivy" unless="ivy.installed">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
<fail message="Ivy has been installed. Run the build again"/>
</target>
</project>
指出:
- 特殊的install-ivy目标来安装ivy jar。
ivysettings.xml
<ivysettings>
<settings defaultResolver="central"/>
<resolvers>
<ibiblio name="central" m2compatible="true"/>
<filesystem name="custom">
<artifact pattern="${ivy.settings.dir}/repo/[maindir]/[subdir]/[artifact][revision].[ext]" />
<artifact pattern="${ivy.settings.dir}/repo/[maindir]/[subdir]/licence/[artifact]" />
</filesystem>
</resolvers>
<modules>
<module organisation="myOrg1" resolver="custom"/>
<module organisation="myOrg2" resolver="custom"/>
<module organisation="myOrg3" resolver="custom"/>
</modules>
</ivysettings>
指出:
- "myOrg1", "myOrg2"one_answers"MyOrg3"依赖关系从本地文件系统下的"repo"目录
- 文件系统解析器中的每个模式都被设计为查找 文件
- 指定了特殊的非标准"maindir"one_answers"subdir"属性(参见ivy文件)
中
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Jar files"/>
<conf name="licence" description="Licence files"/>
</configurations>
<dependencies>
<dependency org="myOrg1" name="somejar" rev="1" e:maindir="direc1" e:subdir="subdir1" conf="compile->default"/>
<dependency org="myOrg1" name="licenceOne.txt" rev="1" e:maindir="direc1" e:subdir="subdir1" conf="licence->default"/>
<dependency org="myOrg2" name="somejar" rev="2" e:maindir="direc2" e:subdir="subdir2" conf="compile->default"/>
<dependency org="myOrg2" name="licenceTwo.txt" rev="2" e:maindir="direc2" e:subdir="subdir2" conf="licence->default"/>
<dependency org="myOrg3" name="somejar" rev="3" e:maindir="direc3" e:subdir="subdir3" conf="compile->default"/>
<dependency org="myOrg3" name="licenceThree.txt" rev="3" e:maindir="direc3" e:subdir="subdir3" conf="licence->default"/>
</dependencies>
</ivy-module>
注意:
- 这个文件列出了构建依赖项。 注意额外的"maindir"one_answers"subdir"属性。文件系统解析器用来查找文件