依赖

用于管理 Java 类文件依赖关系的任务。

描述

depend 任务通过确定哪些类相对于其源代码已过时,然后删除依赖于已过时类的任何其他类的类文件来工作。

为了确定类依赖关系,depend 任务会分析传递给它的所有类文件的类文件。该任务不会以任何方式解析您的源代码,而是依赖于编译器编码到类文件中的类引用。这通常比解析 Java 源文件更快。

要详细了解如何从类文件中获取此信息,请参阅 Java 虚拟机规范

由于类的依赖关系仅在类本身发生更改时才会更改,因此 depend 任务能够缓存依赖关系信息。只有那些已更改的类文件才会重新分析其依赖关系信息。请注意,如果您通过更改源代码来更改类的依赖关系,它将无论如何都会被重新编译。您可以检查创建的依赖关系文件以了解您类的依赖关系。但是,请不要依赖信息的格式,因为它可能会在以后的版本中更改。

一旦 depend 发现所有类依赖关系,它就会“反转”这种关系,以确定每个类哪些其他类依赖于它。此“影响”列表用于发现哪些类因已过时的类而失效。失效类的类文件将被删除,从而触发受影响类的编译。

depend 任务支持一个属性 closure,它控制 depend 是否只考虑直接的类-类关系,或者是否还考虑传递的、间接的关系。例如,假设有三个类 A、B 和 C,其中 A 依赖于 B,B 又依赖于 C。现在假设类 C 已过时。如果没有 closuredepend 只会删除类 B。如果设置了 closure,类 A 也会被删除。通常,直接关系就足够了——类依赖于另一个类而没有直接关系的情况并不常见。如果设置了 closure,您会注意到 depend 通常会删除更多类文件。

<depend>classpath 属性是可选的。如果存在,depend 将根据此类路径上的类和 jar 检查类依赖关系。任何依赖于此类路径中的元素并且比该元素旧的类都将被删除。一个典型的示例是您正在构建一个实用程序 jar 并希望确保相对于此 jar 已过时的类被重建。在此类路径中,您 **不应** 包含您不希望更改的 jar,例如 JDK 运行时 jar 或第三方 jar,因为这样做只会减慢依赖关系检查速度。这意味着如果您确实为 depend 任务使用类路径,它可能与实际编译代码所需的类路径不同。

性能

depend 任务的性能取决于许多因素,例如类关系复杂度和有多少类文件已过时。关于是否更便宜地重新编译所有类还是使用 depend 任务的决定将取决于您的项目大小以及您的类之间的相互关系。

限制

depend 无法检测到一些源代码依赖关系

这些限制最明显的例子是,该任务无法判断在其他类导出的常量原始数据类型发生更改时要重新编译哪些类。例如,对以下内容的定义进行更改:

public final class Constants {
    public final static boolean DEBUG=false;
}

将不会被其他类捕获。

参数

属性 描述 必需
srcDir 这是源代码所在的目录。depend 将检查它以确定哪些类已过时。如果您使用多个源代码目录,您可以将此属性传递给源代码目录的路径。
destDir 这是将要分析的类文件的根目录。 否;默认为 srcdir
cache 这是一个目录,depend 可以存储和检索依赖关系信息。 否;默认为不缓存
closure 此属性控制 depend 是否只删除直接依赖于已过时类的类。如果将其设置为 truedepend 将遍历类依赖关系图,删除所有受影响的类。 否;默认为 false
dump 如果为 true,则依赖关系信息将写入调试级别日志 否;默认为 false
classpath 包含 <depend> 也应检查依赖关系的 jar 和类的类路径
warnOnRmiStubs 标志用于禁用有关看起来像 rmic 生成的存根/骨架类并且没有 .java 源代码的文件的警告。在进行 RMI 开发时很有用。 否;默认为 true

作为嵌套元素指定的参数

depend 任务的 classpath 属性是一个 路径状结构,也可以通过嵌套的 <classpath> 元素设置。

此外,此任务形成一个隐式的 FileSet,并支持 <fileset> 的大多数属性(dir 变为 srcdir),以及嵌套的 <include><exclude><patternset> 元素。

示例

删除 ${build.classes} 目录中任何依赖于已过时类的类。类被认为相对于 ${java.dir} 目录中的源代码已过时,使用与 <javac> 任务相同的机制。在此示例中,<depend> 任务将其依赖关系信息缓存到 depcache 目录中。

<depend srcdir="${java.dir}"
        destdir="${build.classes}"
        cache="depcache"
        closure="yes"/>

与上一个示例相同,但显式包含所有 .java 文件,除了与 ${java.dir}/build_excludes 中给出的列表匹配的文件。

<depend srcdir="${java.dir}" destdir="${build.classes}"
        cache="depcache" closure="yes">
  <include name="**/*.java"/>
  <excludesfile name="${java.dir}/build_excludes"/>
</depend>