嗨,我正在尝试构建一个基于 if 条件复制某个 lib 文件的 ant 脚本。但是它似乎不起作用,因为我收到此错误:

build.xml:20:文件集不支持嵌套的“if”元素。

这是失败的部分:

<target name="resolve">
        <delete dir="${lib.dir}">
            <include name="*" />
        </delete>

        <copy todir="${lib.dir}">
            <fileset dir="ext-libs" >
                <if name="${release}" value="true">
                    <include name="hello-client-[^DEBUG]*.jar" />
                </if>
                <else>
                    <include name="hello-client-*DEBUG.*.jar" />
                </else>

            </fileset>
        </copy>
    </target>

最佳答案

@JoseK 是对的。 ANT 文件集不支持嵌套的“if”语句。事实上,“if”语句不是核心 ANT 的一部分,推荐的方法是使用条件目标(参见示例)

@slipset 在正确的轨道上。 Ivy configurations 可用于有选择地选择您的依赖项。

例子

此示例旨在以两种方式之一调用

$ ant clean build
$ tree
.
|-- build.xml
|-- ivy.xml
`-- lib
    |-- slf4j-api-1.6.4.jar
    `-- slf4j-simple-1.6.4.jar

或者
$ ant -Drelease=1 clean build
$ tree
.
|-- build.xml
|-- ivy.xml
`-- lib
    |-- logback-classic-1.0.3.jar
    |-- logback-core-1.0.3.jar
    `-- slf4j-api-1.6.4.jar

构建文件
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="resolve">
        <ivy:resolve/>
    </target>

    <target name="retrieve-alt" depends="resolve" unless="release">
        <ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]" conf="altruntime"/>
    </target>

    <target name="retrieve-release" depends="resolve" if="release">
        <ivy:retrieve pattern="lib/[artifact]-[revision](-[classifier]).[ext]" conf="runtime"/>
    </target>

    <target name="build" depends="retrieve-alt,retrieve-release"/>

    <target name="clean">
        <delete dir="lib"/>
    </target>

</project>

笔记:
  • if 除非目标上的 子句对“release”属性的存在执行条件测试。
  • ivy 检索 任务使用配置来决定应使用哪些 jar 来填充“lib”目录。
  • 检索 模式包括一个“分类器”模式,以防万一你的 Ivy 映射拉下额外的 Maven 工件,如源或 javadoc jar。

  • Ivy .xml
    <ivy-module version="2.0">
        <info organisation="com.myspotontheweb" module="demo"/>
    
        <configurations>
            <conf name="compile" description="Required to compile application"/>
            <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
            <conf name="altruntime"   description="Alternative 'runtime' configuration" extends="compile"/>
            <conf name="test"    description="Required for test only" extends="altruntime"/>
        </configurations>
    
        <dependencies>
            <!-- compile dependencies -->
            <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>
    
            <!-- runtime dependencies -->
            <dependency org="ch.qos.logback" name="logback-classic" rev="1.0.3" conf="runtime->default"/>
    
            <!-- altruntime dependencies -->
            <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="altruntime->default"/>
    
            <!-- test dependencies -->
            <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
        </dependencies>
    
    </ivy-module>
    

    笔记:
  • 我强烈建议始终为每个依赖项指定一个配置映射。这将直接映射到您打算如何使用 jars,例如填充类路径。

  • 附录

    如何使用 Ivy 配置

    Ivy 配置可用于模拟 Maven 范围,但实际上 Ivy 配置可以表示依赖项的任何逻辑分组。

    以下是任何 Java 构建所需的 3 个标准类路径:
    <configurations>
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="runtime"/>
    </configurations>
    

    请注意使您能够创建更大集合的“扩展”语法。例如, 运行时 jar 集还包括 编译 代码所需的任何内容。

    Ivy 配置很难理解,除非您意识到它们可用于有选择地填充 ANT 路径:
    <ivy:cachepath pathid="compile.path" conf="compile"/>
    
    <javac ..... classpathref="compile.path"/>
    

    或用于有选择地填充目录
    <ivy:retrieve pattern="build/WEB-INF/lib/[artifact].[ext]" conf="runtime"/>
    

    配置映射

    映射用于确定项目中的 jar 组如何与其他项目中的 jar 组相关联。

    这通常发生如下:
    <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" conf="compile->default"/>
    

    这里我们的 编译 配置由远程 默认 配置填充(通常其他模块编译依赖项)

    关于ant 脚本不能支持嵌套的 If 语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10447190/

    10-15 22:30