Ant使用antlib与命名空间

Lim*_*ent 1 java ant ant-contrib

我使用以下演示脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" basedir="." xmlns:deploy="antlib:net.sf.antcontrib">
    <target name="default">
        <taskdef resource="net/sf/antcontrib/antlib.xml">
            <classpath>
                <pathelement location="lib/ant-contrib-1.0b3.jar"/>
            </classpath>
        </taskdef>
        <deploy:if>
            <isset property="defaultprop"/>
            <then>
                <echo message="it's set!"/>
            </then>
        </deploy:if>
    </target>
</project>
Run Code Online (Sandbox Code Playgroud)

当我运行这个构建脚本(带目标default)时,错误是

build.xml:9: Problem: failed to create task or type antlib:net.sf.antcontrib:if
Run Code Online (Sandbox Code Playgroud)

这个问题lib/ant-contrib-1.0b3.jar存在,蚂蚁正在捡起它.我在想问题是我如何使用xmlns.我从另一个我不具备的例子中得到这个(虽然它可以在特定的服务器上运行!),并试图找出魔法酱是什么.

Dav*_*vid 9

你在taskdef中添加ant-contrib需要声明一个URI,与你在项目中定义的名称空间和前缀相同.类似于taskdef 在这里工作的方式.

<project name="test" basedir="." xmlns:deploy="antlib:net.sf.antcontrib">
    <target name="default">
        <taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml">
            <classpath>
                <pathelement location="lib/ant-contrib-1.0b3.jar"/>
            </classpath>
        </taskdef>
        <deploy:if>
            <isset property="defaultprop"/>
            <then>
                <echo message="it's set!"/>
            </then>
        </deploy:if>
    </target>
</project>
Run Code Online (Sandbox Code Playgroud)

  • 如果你从taskdef和项目级别的xmlns声明中删除了uri,那么任务最终会在默认命名空间中,所以你可以像`<if>`而不是`<prefix:if>`那样调用它们.前缀可以方便地保存具有冲突名称的内容不会发生冲突,就像java中的包一样,并且还可以一目了然地识别某些功能的来源. (2认同)