第一次提交
This commit is contained in:
commit
8121362a03
4412 files changed
+1091845
No files matched your search
@@ -0,0 +1,194 @@
|
||||
<!--
|
||||
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>
|
||||
Reference in new issue
Block a user