java - 在构建错误后从 ANT 停止的地方继续

标签 java android ant build build-process

我有一个 ant 构建脚本,可以构建许多 android 项目。

我正在按照文本文件中的属性给我的特定顺序构建所有项目。

ant 构建脚本调用每个项目自己的 build.xml 文件来构建该项目。

如果项目构建失败,我如何让 ant 从因错误而停止的地方继续构建?

基本上,如果我正在构建项目 ABCDE。构建过程在 C 失败,当开发人员再次开始构建时,我该怎么做才能让构建过程在 C 继续?

此外,构建过程需要重新构建开发人员更改的内容。例如,C 中的问题是因为 A 中的问题,而 C 依赖于 A。因此,它需要重建 A,跳过 B,重建 C 并继续。 o.O

正在寻找想法,或者是否已经有这样做的东西。

谢谢!

最佳答案

Ant 和 Make 一样,非常擅长在您离开时确定从哪里继续。 <javac>除非更新源,否则任务不会重新编译代码。 <copy>默认情况下,任务不会重新复制文件。但是,如果您将构建分成多个文件,然后使用 <ant>任务而不是使用 depends你的参数 <target> ,你会破坏这个系统。

假设您有独立的项目ABCD。你所有的build.xml所做的是在每个目标中调用正确的目标。假设每个构建一个 jar 文件。由于 Java 错误,该过程在项目 C 上中断。开发人员修复了它。你运行你的 build.xml再次,它将再次调用项目 AB。然而,由于这些项目已经建成,他们不应该做任何事情。您会看到对 AB 的调用,但什么也不会发生。

即使在项目 C 中,构建过程也会从它停止的地方开始。也就是说,如果您没有采取任何措施来破坏 Ant 计算其构建的能力。

破解Ant的方法有很多。例如,不要在构建过程中删除文件。如果目标文件不再存在,Ant 无法使用时间戳来确定要做什么。

有时,一个过程需要一点帮助来避免构建。 Ant 有一个内置的 <uptodate>任务,但我找到了 <outofdate> 更容易使用。例如,假设项目 A 生成项目 B 使用的 jar 文件。如果 jar 中使用的类文件和资源早于 jar 上的时间戳,您可能希望使用这些任务之一不复制该 jar。

否则,如果您只是盲目地将 jar 复制到项目 B,项目 B 将看到类文件所依赖的文件已更新。因此,Project B 将重新编译所有内容。然后复制所有内容,并重建它正在构建的任何 jar 或 war。我遇到了 third party task 的问题直接更新 Java 类文件,并且必须使用监视文件来确保我没有运行两次编译,尤其是修改类文件的任务。

顺便说一下,不要对 Ant 所说的正在执行的目标感到不安。 Ant 将执行这些目标,但组成这些目标的任务将不会运行,除非更新了某些内容。


更新:使用<outofdate>来自 Ant 贡献

假设在您的主项目文件中,您有以下目标:

<target name="build"
    description="Builds every sub project">
    <ant antfile=${project.a.dir}/build.xml target="build"/>
    <ant antfile=${project.b.dir}/build.xml target="build"/>
    <ant antfile=${project.c.dir}/build.xml target="build"/>
    <ant antfile=${project.d.dir}/build.xml target="build"/>

使用 <outofdate> :

<target name="build"
    description="Builds every sub project">

    <outofdate>
       <sourcefiles>
           <fileset dir="${project.a.srcdir}"/>
       </sourcefiles>
       <targetfiles>
           <fileset dir="${project.a.dir}/target">
              <include name="*.jar"/>
           </fileset>
       </targetfiles>
       <sequential>
           <ant antfile=${project.a.dir}/build.xml
               target="build"/>
       </sequential>
    </outofdate>

    <outofdate>
       <sourcefiles>
           <fileset dir="${project.b.srcdir}"/>
       </sourcefiles>
       <targetfiles>
           <fileset dir="${project.a.dir}/target">
              <include name="*.jar"/>
           </fileset>
       </targetfiles>
       <sequential>
           <echo>CALLING PROJECT: ${project.b.dir}</echo>
           <ant antfile=${project.b.dir}/build.xml
               target="build"/>
       </sequential>
    </outofdate>

    <etc, etc, etc/>

如果设置正确,您可能可以在 Ant-Contrib 中完成所有操作 <for>循环,因此您不必为每个子项目都执行此操作。

我不知道这样会不会更快。 <outofdate>任务仍然必须遍历所有文件并进行日期比较,但至少您不会看到它调用子项目文件中的所有目标。

关于java - 在构建错误后从 ANT 停止的地方继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076743/

相关文章:

java - 在 java 中使用未指定的通用通配符

Android Studio, ImageView ,

mysql - ${Env.CATALINA_HOME} 在 openshift 中不退出

java - 相当于Clojure中的imshow?

java - 通过 Android 上的 TCP 套接字流式传输音频

android - 在android中打印现有的pdf文件

java - 如何修复在类 com.example.chatappfirebase.Model.User 上找不到 id 的 setter /字段?

xpath - 如果 XML 文件具有不同 namespace 中的元素,则使用 XMLTasks 的 ant 的 XMLPath 无法匹配

java - Ant 构建失败

java - 两个锁有可能发生死锁吗?