我在一个名为buil-dependencies.xml的文件中定义了以下内容
<?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.xml文件的顶部。现在,我需要使工件文件夹成为一个参数,以便在执行不同目标时对其进行更改。拥有这个..。
<?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>在目标中定义“工件”属性(并对其进行更改)的...and不起作用,因为在构建依赖的the中定义路径时,似乎会发生属性替换。
我怎么才能解决这个问题?我的一种想法是在实际使用路径之前拥有一个参数化宏并调用它,但这似乎不太优雅。就像这样:
<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>编辑:常春藤和命令行参数不是一个选项。
发布于 2010-03-30 06:44:22
您不需要参数化路径。你想要一个PatternSet。您可以在顶层定义模式集,然后在需要时在单个目标中引用它。以你为例:
<?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>发布于 2010-03-24 19:58:13
让我们调用您的文件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>现在,当您想要更改它并为该工件属性使用另一个值时,我们将这样运行脚本。
ant -Dartifacts=new-value这将覆盖build.xml中的硬编码工件值。
如果使用ant目标,您可以执行类似的操作,在第一行的目标中定义属性,如果要覆盖默认值,则在调用该目标时将属性作为参数传递。
你的评论让我想起了另外一件事。让开发人员创建一个工件-dir-name.xml文件。它将只有一行:
<?xml version="1.0" encoding="UTF-8"?>
<project name="artifacts-file">
<property name="artifacts" value="new-value" />
</project>现在,在您的build.xml文件中,在定义工件属性的行之前,导入该文件:
<import file="artifacts-dir-name.xml" optional="true" />在Eclipse中,如果存在此文件,则从该文件读取属性,并将工件设置为“新值”,否则将从build.xml读取该属性并设置为"first-value“。开发人员所需要做的就是确保该目录中存在工件-dir-name.xml文件。这也可以在Eclipse中运行。
发布于 2010-03-24 20:20:30
我建议使用常春藤来管理类路径依赖项。Ivy有一个名为configurations的简洁概念,它允许您根据工件的使用情况对工件集合进行分组。
下面是我自己构建的一个文件中的一个适配器:
<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文件中进行管理(将取代构建依赖的文件)
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="HelloWorld"/>
<configurations>
<conf name="build" description="jars needed for build" />
<conf name="runtime" extends="build" description="jars needed at runtime" />
</configurations>
<dependencies>
<dependency org="org1" name="project1" rev="1.0" conf="build->default"/>
<dependency org="org2" name="project2" rev="1.0" conf="build->default"/>
<dependency org="org3" name="project3" rev="1.0" conf="runtime->default"/>
<dependency org="org4" name="project4" rev="1.0" conf="runtime->default"/>
</dependencies>
</ivy-module>与每个项目相关联的jar工件将自动从在线maven存储库下载和缓存,或者您可以创建自己的本地存储库来保存本地拥有的工件的集合。
https://stackoverflow.com/questions/2505283
复制相似问题