ant脚本无法支持嵌套If语句?

嗨,我正在尝试构建一个基于if条件复制某个lib文件的ant脚本.但它似乎没有工作,因为我得到这个错误:

build.xml:20:fileset不支持嵌套的“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

build.xml文件

<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和unless子句对“release”属性的存在执行条件测试.
>常春藤检索任务使用配置来决定应该使用哪些罐来填充“lib”目录.
>检索模式包括一个“分类器”模式,以防你常春藤映射拉下额外的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>

注意:

>我强烈建议始终为每个依赖项指定配置映射.然后,这将直接映射到您打算如何使用jar,例如填充类路径.

附录

如何使用常春藤配置

常春藤配置可用于模拟Maven范围,但实际上常春藤配置可以表示依赖关系的任何逻辑分组.

以下是任何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的运行时集还包括编译代码所需的任何内容.

在您意识到它们可用于有选择地填充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"/>

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

相关文章
相关标签/搜索