如何在ANT中参数化路径?
我在一个名为build-dependencies.xml的文件中定义了以下内容如何在ANT中参数化路径?,ant,path,Ant,Path,我在一个名为build-dependencies.xml的文件中定义了以下内容 ... ... 我将其包含在build.xml文件的顶部。现在我需要将artifacts文件夹设置为一个参数,以便在执行不同的目标时可以对其进行更改。 有这个 <?xml version="1.0" encoding="UTF-8"?> <project name="build-dependencies"> ... <path id="common-jars">
...
...
我将其包含在build.xml文件的顶部。现在我需要将artifacts文件夹设置为一个参数,以便在执行不同的目标时可以对其进行更改。
有这个
<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
...
<path id="common-jars">
<fileset file="${artifacts}/project-1/jar/some*.jar" />
<fileset file="${artifacts}/project-2/jar/someother*.jar" />
</path>
...
</project>
...
...
…并且在目标中定义“工件”属性(并对其进行更改)不起作用,因为在build-dependencies.xml中定义路径时,似乎会发生属性替换
我怎样才能解决这个问题?我想的一种方法是使用一个参数化宏,并在实际使用路径之前调用它,但这似乎并不优雅。大概是这样的:
<macrodef name="create-common-jars">
<attribute name="artifacts"/>
<sequential>
<path id="common-jars">
<fileset file="@{artifacts}/project-1/jar/some*.jar" />
<fileset file="@{artifacts}/project-2/jar/someother*.jar" />
</path>
</sequential>
</macrodef>
编辑:Ivy和命令行参数不是选项。让我们调用您的文件build.xml。所以您可以通过运行ant命令来执行它。在第一种情况下,工件名称硬编码在下面第三行定义的属性中
<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
<property name="artifacts" value="first-value" />
...
<path id="common-jars">
<fileset file="artifacts/project-1/jar/some*.jar" />
<fileset file="artifacts/project-2/jar/someother*.jar" />
</path>
...
</project>
这将覆盖build.xml中的硬编码工件值
如果使用ant目标,则可以执行类似的操作,在第一行的目标中定义属性,如果要覆盖默认值,则在调用该目标时将属性作为参数传递
你的评论让我想起了另一件事。让开发人员创建artifacts-dir-name.xml文件。它只有一行:
<?xml version="1.0" encoding="UTF-8"?>
<project name="artifacts-file">
<property name="artifacts" value="new-value" />
</project>
现在,在build.xml文件中,在定义artifacts属性的行之前,导入该文件,如下所示:
<import file="artifacts-dir-name.xml" optional="true" />
现在在Eclipse中,如果该文件存在,则从中读取属性并将工件设置为“新值”,否则从build.xml读取属性并将其设置为“第一个值”。开发人员需要做的就是确保artifacts-dir-name.xml文件存在于该目录中。这也可以在Eclipse中运行。我建议使用来管理类路径依赖关系。Ivy有一个称为配置的简洁概念,允许您根据其使用情况对工件集合进行分组
以下是我自己的一个构建文件的改编:
<target name="retrieve" description="3rd party dependencies">
<ivy:resolve/>
<ivy:cachepath pathid="build.path" conf="build"/>
<ivy:cachepath pathid="runtime.path" conf="runtime"/>
</target>
配置在ivy.xml文件中管理(将替换build-dependencies.xml文件)
与每个项目相关联的jar工件将从在线maven存储库中自动下载和缓存,或者您可以创建自己的本地存储库来保存本地拥有的工件集合 使用环境变量是否是一个选项(如果在启动eclipse时设置了环境变量,则会选择它们)?如果是这样的话,让每一个都设置工件,这应该是可行的:
<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
<property environment="env"/>
<path id="common-jars">
<fileset file="${env.ARTIFACTS}/project-1/jar/some*.jar" />
<fileset file="${env.ARTIFACTS}/project-2/jar/someother*.jar" />
</path>
</project>
好的,我想我没有其他明显的方法来完成我想做的事情,除了使用一个宏来获取参数并使用适当的artifacts文件夹创建路径 让我们了解一下上下文,为什么我要尝试我想要的是在不同的文件夹中有“插入指令的”和“未插入指令的”工件。在我的“目标”中,我可以改变工件模式。所以我现在要做的是我有一个宏:
,它设置了所有路径和其他变量
谢谢大家的回答。你们不需要参数化的路径。你想要一个。您可以在顶层定义图案集,然后在需要时在单个目标中引用它。例如:
<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
...
<patternset id="common-jars">
<include name="project-1/jar/some*.jar" />
<include name="project-2/jar/someother*.jar" />
</patternset>
...
<path id="instrumented-jars">
<fileset dir="instrumented">
<patternset refid="common-jars" />
</fileset>
</path>
...
<path id="standard-jars">
<fileset dir="not-instrumented">
<patternset refid="common-jars" />
</fileset>
</path>
...
</project>
...
...
...
...
您可以使用不同的依赖项执行此操作:
setpath.xml:
<project name="setpath">
<target name="setCommonJars">
<path id="common-jars">
<fileset file="${param1}/some*.jar" />
<fileset file="${param1}/someother*.jar" />
</path>
</target>
</project>
build.xml:
<project name="Test path" basedir=".">
<import file="./setpath.xml" />
<target name="buildT1" depends="setT1,setCommonJars">
<property name="jar-str" refid="common-jars" />
<echo message="buildT1: ${jar-str}" />
</target>
<target name="buildT2" depends="setT2,setCommonJars">
<property name="jar-str" refid="common-jars" />
<echo message="buildT2: ${jar-str}" />
</target>
<target name="setT1">
<property name="param1" value="t1" />
</target>
<target name="setT2">
<property name="param1" value="t2" />
</target>
</project>
如果您调用target buildT1,那么将使用t1目录,如果您调用buildT2,那么将使用t2目录。我知道Ivy,不幸的是,它不是一个选项。是的,我考虑过这种方式,但我希望这些目标可以从Eclipse运行,而不需要配置额外的选项。因此,开发人员可以检查代码并只运行ant目标。因此,这也不是一个选项:(@strelokstrelok by“parameterize”您是指从控制台发出build命令,并在build命令之后传递构建脚本中变量的参数?有一种不同的方法;请参阅我的答案。您可能会认为您更喜欢宏,但模式集更具声明性。
<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
...
<patternset id="common-jars">
<include name="project-1/jar/some*.jar" />
<include name="project-2/jar/someother*.jar" />
</patternset>
...
<path id="instrumented-jars">
<fileset dir="instrumented">
<patternset refid="common-jars" />
</fileset>
</path>
...
<path id="standard-jars">
<fileset dir="not-instrumented">
<patternset refid="common-jars" />
</fileset>
</path>
...
</project>
<project name="setpath">
<target name="setCommonJars">
<path id="common-jars">
<fileset file="${param1}/some*.jar" />
<fileset file="${param1}/someother*.jar" />
</path>
</target>
</project>
<project name="Test path" basedir=".">
<import file="./setpath.xml" />
<target name="buildT1" depends="setT1,setCommonJars">
<property name="jar-str" refid="common-jars" />
<echo message="buildT1: ${jar-str}" />
</target>
<target name="buildT2" depends="setT2,setCommonJars">
<property name="jar-str" refid="common-jars" />
<echo message="buildT2: ${jar-str}" />
</target>
<target name="setT1">
<property name="param1" value="t1" />
</target>
<target name="setT2">
<property name="param1" value="t2" />
</target>
</project>