Ant:导入的构建文件中的“导入中的重复项目名称”

时间:2011-12-19 19:11:00

标签: ant build

我有几个构建文件,它们都导入相同的基本构建文件,如下所示:

base.xml:

<project name="base">
    <!-- does not define a 'build' target -->
</project>

buildA.xml:

<project name="buildA">
    <import file="base.xml" />
    <target name="build">
        <ant antfile="buildB.xml" target="build"
            inheritall="false" inheritrefs="false" />
    </target>
</project>

buildB.xml:

<project name="buildB">
    <import file="base.xml" />
    <target name="build">
        ...snip...
    </target>
</project>

(模块A取决于模块B。)

现在,上面从 buildA.xml 调用B的build目标会出现以下错误:

Duplicated project name in import. Project base defined first in buildA.xml and again in buildB.xml

由于 buildA.xml buildB.xml 都继承了相同的 base.xml ,这似乎是不可避免的。

我怎么能摆脱这个错误?

2 个答案:

答案 0 :(得分:2)

根据sudocode的回答,我解决了这个问题。由于 base.xml 的绝对路径在两种情况下都不同,因此Ant不会将其识别为同一文件。即使inheritAll设置为false,也会保留调用任务的上下文,这会导致名称冲突。

要解决此问题,可以省略 base.xml 中的name属性。从Ant 1.8开始,import任务具有属性as,当基础项目无名时,该属性可用于引用基础目标。如果您未覆盖任何目标,则可以使用include代替import。我在1.7,所以这对我没有帮助。

对于以前版本的Ant,您可以通过exec调用来完全防止Ant上下文的扩散(然后您将获得两个正在运行的Ant实例)。更好的是,找到一种方法在两个文件中导入完全相同的 base.xml (具有相同的绝对路径)。

答案 1 :(得分:1)

您使用的是Ant 1.6吗?这个resolved Ant bug看起来像是同一个问题。

修改

我尝试重现你在最近评论中提到的目录结构。

./base.xml
./buildA
./buildA/buildA.xml
./buildB
./buildB/buildB.xml

并相应地修改了构建文件,例如

<project name="buildA">
<import file="../base.xml"/>
<target name="build">
  <ant antfile="../buildB/buildB.xml" target="build" inheritall="false" inheritrefs="false"/>
</target>
</project>

对于使用ant 1.8.2或1.7.1的以下内容,我仍然没有出现构建错误:

ant -f buildA/buildA.xml build