Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ANT中参数化路径?_Ant_Path - Fatal编程技术网

如何在ANT中参数化路径?

如何在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-dependencies.xml的文件中定义了以下内容


...
...
我将其包含在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>