为什么我的Ant master构建文件不能正常工作?

时间:2009-04-14 18:59:29

标签: java ant build

我们有一堆Ant脚本,每个子项目一个。最后,我们想要从主构建脚本运行所有这些,并进行一些其他清理以打包整个项目。每个单独的Ant脚本都命名为ant.xml,并且位于其项目的子目录中。每个人都使用Ant import导入ant-commons.xml,然后覆盖那里的一些特定目标。

例如,其中一个项目会覆盖compile目标,适当设置classpath,并将sourcetarget设置为1.5(公共使用1.4)

现在,从理论上讲,这听起来很容易。这是主构建脚本:

<project name="Retain" basedir="." default="main">
  <target name="main">
    <ant dir="SharedJava" antfile="ant.xml" target="clean"/>
    <ant dir="SharedJava" antfile="ant.xml" target="copy_current"/>
    <ant dir="GWEasySoap" antfile="ant.xml" target="clean"/>
    <ant dir="GWEasySoap" antfile="ant.xml" target="copy_current"/>
    <ant dir="RetainLib" antfile="ant.xml" target="clean"/>
    <ant dir="RetainLib" antfile="ant.xml" inheritAll="false"  target="copy_current"/>
    <ant dir="RetainIndex" antfile="ant.xml" target="clean"/>
    <ant dir="RetainIndex" antfile="ant.xml" target="copy_current"/>
    <ant dir="RetainPersist" antfile="ant.xml" target="clean"/>
    <ant dir="RetainPersist" antfile="ant.xml" target="copy_current"/>
  </target>
</project>

实际发生的事情:

前几个子项目运行正常。 RetainLib,实际上,需要引用SharedJava的jar,然后失败,抱怨它无法找到它。当我删除RetainLib时,RetainIndex失败了,抱怨你不应该在1.4目标文件中使用泛型。

在玩完之后,我确定这些只是坚持在ant-commons内运行编译目标而不是被覆盖的编译目标。

为什么呢?我怎么能绕过这个? (我的意思是 - 我的意思是 - 显然我可以完全取消使用ant-commons,我敢打赌会有效。)

3 个答案:

答案 0 :(得分:1)

我建议在任务中使用 inheritAll =“false”属性。您看到的问题与master文件的basedir和其他属性导致子项目的相对路径出现问题有关。

我还会放弃 dir =“..”属性,以确保子项目能够获胜。

所以这就是我要做的......

<project name="Retain" basedir="." default="main">
  <target name="main">
    <ant antfile="SharedJava/ant.xml" target="clean" inheritAll="false"/>
    <ant antfile="SharedJava/ant.xml" target="copy_current" inheritAll="false"/>
    <ant antfile="GWEasySoap/ant.xml" target="clean" inheritAll="false"/>
    <ant antfile="GWEasySoap/ant.xml" target="copy_current" inheritAll="false"/>
    ...
  </target>
</project>

答案 1 :(得分:1)

我参与了一个与此类似的项目,所做的是创建一个构建目录,其中放置了所有ant任务的输出,它工作正常。如果没有关于构建文件内部内容的其他信息,将很难提供额外的见解

答案 2 :(得分:0)

每次调用都会打开一个新的ant实例。即使“SharedJava”在ant-commons.xml中进行了一些覆盖,其他脚本也看不到它。您可以尝试在基本脚本中包含ant-commons.xml并使用子服务中的值,因为有些是继承的。对于不可继承的值,比如路径,您可以使用类似命名的参数:

<ant antfile="${check.build.file}" target="validateXml">
   <property name="p.check_dir" location="${project.base.dir}" />
   <property name="p.dtd_dir" location="${build.data.dir}" />
</ant>

我选择在外部脚本的任务中没有依赖关系,但是那些表示为其调用的参数。