195 lines
9.0 KiB
HTML
195 lines
9.0 KiB
HTML
<!--
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
(the "License"); you may not use this file except in compliance with
|
|
the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
-->
|
|
<html>
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Language" content="en-us">
|
|
<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
|
|
<title>Depend Task</title>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<h2>Depend</h2>
|
|
|
|
<p>A task to manage Java class file dependencies.</p>
|
|
|
|
<h3>Description</h3>
|
|
|
|
<p>The <code>depend</code> task works by determining which classes are out of date with respect to
|
|
their source and then removing the class files of any other classes which depend on the out-of-date
|
|
classes.</p>
|
|
|
|
<p>To determine the class dependencies, the <code>depend</code> task analyzes the class files of all
|
|
class files passed to it. The task does not parse your source code in any way but relies upon the
|
|
class references encoded into the class files by the compiler. This is generally faster than parsing
|
|
the Java source files.</p>
|
|
|
|
<p>To learn more about how this information is obtained from the class files, please refer
|
|
to <a href="https://docs.oracle.com/javase/specs/" target="_top">the Java Virtual Machine
|
|
Specification</a></p>
|
|
|
|
<p>Since a class' dependencies only change when the class itself changes, the
|
|
<code>depend</code> task is able to cache dependency information. Only those class files which have
|
|
changed will have their dependency information re-analysed. Note that if you change a class'
|
|
dependencies by changing the source, it will be recompiled anyway. You can examine the dependency
|
|
files created to understand the dependencies of your classes. Please do not rely, however, on the
|
|
format of the information, as it may change in a later release.</p>
|
|
|
|
<p>Once <code>depend</code> discovers all of the class dependencies, it "inverts" this
|
|
relation to determine, for each class, which other classes are dependent upon it. This
|
|
"affects" list is used to discover which classes are invalidated by the out of date
|
|
class. The class files of the invalidated classes are removed, triggering the compilation of the
|
|
affected classes.</p>
|
|
|
|
<p>The <code>depend</code> task supports an attribute, <var>closure</var>, which controls
|
|
whether <code>depend</code> will only consider direct class-class relationships or whether it will
|
|
also consider transitive, indirect relationships. For example, say there are three classes, A, which
|
|
depends on B, which in-turn depends on C. Now say that class C is out of
|
|
date. Without <var>closure</var>, only class B would be removed
|
|
by <code>depend</code>. With <var>closure</var> set, class A would also be removed. Normally direct
|
|
relationships are sufficient—it is unusual for a class to depend on another without having a
|
|
direct relationship. With <var>closure</var> set, you will notice that <code>depend</code> typically
|
|
removes far more class files.</p>
|
|
|
|
<p>The <var>classpath</var> attribute for <code><depend></code> is optional. If it is
|
|
present, <code>depend</code> will check class dependencies against classes and jars on this
|
|
classpath. Any classes which depend on an element from this classpath and which are older than that
|
|
element will be deleted. A typical example where you would use this facility would be where you are
|
|
building a utility jar and want to make sure classes which are out of date with respect to this jar
|
|
are rebuilt. In this classpath, you should <strong>not</strong> include jars that you do not expect
|
|
to change, such as the JDK runtime jar or third party jars, since doing so will just slow down the
|
|
dependency check. This means that if you do use a classpath for the <code>depend</code> task it may
|
|
be different from the classpath necessary to actually compile your code.</p>
|
|
|
|
<h3>Performance</h3>
|
|
|
|
<p>The performance of the <code>depend</code> task is dependent on a number of factors such as class
|
|
relationship complexity and how many class files are out of date. The decision about whether it is
|
|
cheaper to just recompile all classes or to use the <code>depend</code> task will depend on the size
|
|
of your project and how interrelated your classes are.</p>
|
|
|
|
<h3>Limitations</h3>
|
|
|
|
<p>There are some source dependencies which <code>depend</code> will not detect:</p>
|
|
|
|
<ul>
|
|
<li>If the Java compiler optimizes away a class relationship, there can be a source dependency
|
|
without a class dependency.</li>
|
|
|
|
<li>Non-public classes cause two problems. Firstly, depend cannot relate the class file to a source
|
|
file. In the future this may be addressed using the source file attribute in the
|
|
classfile. Secondly, neither <code>depend</code> nor the compiler tasks can detect when a non-public
|
|
class is missing. Inner classes are handled by the <code>depend</code> task.</li>
|
|
</ul>
|
|
|
|
<p>The most obvious example of these limitations is that the task can't tell which classes to
|
|
recompile when a constant primitive data type exported by other classes is changed. For example, a
|
|
change in the definition of something like</p>
|
|
<pre>
|
|
public final class Constants {
|
|
public final static boolean DEBUG=false;
|
|
}</pre>
|
|
<p>will not be picked up by other classes.</p>
|
|
|
|
<h3>Parameters</h3>
|
|
<table class="attr">
|
|
<tr>
|
|
<th scope="col">Attribute</th>
|
|
<th scope="col">Description</th>
|
|
<th scope="col">Required</th>
|
|
</tr>
|
|
<tr>
|
|
<td>srcDir</td>
|
|
<td>This is the directory where the source exists. <code>depend</code> will examine this to
|
|
determine which classes are out of date. If you use multiple source directories you can pass
|
|
this attribute a path of source directories.</td>
|
|
<td>Yes</td>
|
|
</tr>
|
|
<tr>
|
|
<td>destDir</td>
|
|
<td>This is the root directory of the class files which will be analysed.</td>
|
|
<td>No; defaults to <var>srcdir</var></td>
|
|
</tr>
|
|
<tr>
|
|
<td>cache</td>
|
|
<td>This is a directory in which <code>depend</code> can store and retrieve dependency
|
|
information.</td>
|
|
<td>No; defaults to no cache</td>
|
|
</tr>
|
|
<tr>
|
|
<td>closure</td>
|
|
<td>This attribute controls whether <code>depend</code> only removes classes which directly
|
|
depend on out of date classes. If this is set to <q>true</q>, <code>depend</code> will
|
|
traverse the class dependency graph deleting all affected classes.</td>
|
|
<td>No; defaults to <q>false</q></td>
|
|
</tr>
|
|
<tr>
|
|
<td>dump</td>
|
|
<td>If true the dependency information will be written to the debug level log</td>
|
|
<td>No; default is <q>false</q></td>
|
|
</tr>
|
|
<tr>
|
|
<td>classpath</td>
|
|
<td>The classpath containing jars and classes for which <code><depend></code> should also
|
|
check dependencies</td>
|
|
<td>No</td>
|
|
</tr>
|
|
<tr>
|
|
<td>warnOnRmiStubs</td>
|
|
<td>Flag to disable warnings about files that look like <kbd>rmic</kbd> generated
|
|
stub/skeleton classes and have no <samp>.java</samp> source. Useful when doing RMI
|
|
development.</td>
|
|
<td>No; default <q>true</q></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h3>Parameters specified as nested elements</h3>
|
|
<p>The <code>depend</code> task's <var>classpath</var> attribute is
|
|
a <a href="../using.html#path">path-like structure</a> and can also be set via a
|
|
nested <code><classpath></code> element.</p>
|
|
|
|
<p>Additionally, this task forms an implicit <a href="../Types/fileset.html">FileSet</a> and
|
|
supports most attributes of <code><fileset></code> (<var>dir</var> becomes <var>srcdir</var>),
|
|
as well as the nested <code><include></code>, <code><exclude></code>,
|
|
and <code><patternset></code> elements.</p>
|
|
|
|
<h3>Examples</h3>
|
|
|
|
<p>Remove any classes in the <samp>${build.classes}</samp> directory that depend on out-of-date
|
|
classes. Classes are considered out-of-date with respect to the source in
|
|
the <samp>${java.dir}</samp> directory, using the same mechanism as the <code><javac></code>
|
|
task. In this example, the <code><depend></code> task caches its dependency information in
|
|
the <samp>depcache</samp> directory.</p>
|
|
<pre>
|
|
<depend srcdir="${java.dir}"
|
|
destdir="${build.classes}"
|
|
cache="depcache"
|
|
closure="yes"/></pre>
|
|
|
|
<p>Do the same as the previous example, but explicitly include all <samp>.java</samp> files, except
|
|
those that match the list given in <samp>${java.dir}/build_excludes</samp>.</p>
|
|
<pre>
|
|
<depend srcdir="${java.dir}" destdir="${build.classes}"
|
|
cache="depcache" closure="yes">
|
|
<include name="**/*.java"/>
|
|
<excludesfile name="${java.dir}/build_excludes"/>
|
|
</depend></pre>
|
|
|
|
</body>
|
|
</html>
|