|
|
@@ -0,0 +1,113 @@ |
|
|
|
<?xml version="1.0"?> |
|
|
|
<document> |
|
|
|
|
|
|
|
<properties> |
|
|
|
<title>On ClassLoaders in Ant2</title> |
|
|
|
<author email="peter@apache.org">Peter Donald</author> |
|
|
|
</properties> |
|
|
|
|
|
|
|
<body> |
|
|
|
|
|
|
|
<section name="ClassLoader Management"> |
|
|
|
|
|
|
|
<p>In many ways Ant2 needs to follow rules similar to a number of |
|
|
|
different application servers with respect to ClassLoader management. |
|
|
|
Ant2 will create a number of different ClassLoaders that have access |
|
|
|
to different sets of resources (and thus Classes). The main reason |
|
|
|
for this arrangment is to partition different sections of the |
|
|
|
application such as the Container, the Task API, task/type libraries |
|
|
|
and support libraries.</p> |
|
|
|
|
|
|
|
<p>The recomended structure for ClassLoader relationships is a hierarchy. |
|
|
|
When a ClassLoader is asked for a resource (or a class) it first delegates |
|
|
|
to it's parent to ask for the resource. If the resource is not present in |
|
|
|
its parent ClassLoader then the ClassLoader attempts to locate the resource |
|
|
|
in it's own store. In practice this means that all the classes (and static |
|
|
|
variables defined by said classes) in a parent ClassLoader are shared with |
|
|
|
the child ClassLoaders.</p> |
|
|
|
|
|
|
|
<p>Using kooky ascii art, the specific ClassLoader structure for Ant2 is as |
|
|
|
follows:</p> |
|
|
|
|
|
|
|
<source> |
|
|
|
Bootstrap |
|
|
|
| |
|
|
|
System |
|
|
|
| |
|
|
|
Common |
|
|
|
/ \ |
|
|
|
Container Shared |
|
|
|
/ \ |
|
|
|
Antlib1 Antlib2 ... |
|
|
|
</source> |
|
|
|
|
|
|
|
<ul> |
|
|
|
<li> |
|
|
|
The <strong>Bootstrap</strong> ClassLoader contains the classes and resources |
|
|
|
provided by the Java runtime. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
The <strong>System</strong> ClassLoader contains the classes that were made accessible |
|
|
|
via the CLASSPATH environment variable. If the standard ant script was used then this |
|
|
|
should only contain the classes that are used to bootstrap the ant runtime. ie |
|
|
|
<code>$ANT_HOME/bin/ant-launcher.jar</code> |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
The <strong>Common</strong> ClassLoader contains the classes and resources |
|
|
|
that are made visible to both the Container and to all the ant type librarys. This |
|
|
|
contains all the classes that the Container uses to communicate with tasks and other |
|
|
|
supporting infrastructure. In particular it contains the following APIs; |
|
|
|
<ul> |
|
|
|
<li> |
|
|
|
<em>Task API</em> - Contains the classes that are part of the API used |
|
|
|
to define tasks. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
<em>ProjectListener API</em> - Contains the classes necessary to define new |
|
|
|
ProjectListeners. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
<em>Aspect API</em> - Contains the classes that are used to define Aspects |
|
|
|
of the container. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
<em>Container API</em> - Contains the interfaces that are required to communicate |
|
|
|
with the objects deep within the container. <strong>NOTE</strong>: These interfaces |
|
|
|
are not to be used by user tasks but are made available so that certain tasks (such |
|
|
|
as <antcall/>) can be implemented. However they are subject to change without |
|
|
|
notice between between different ant2 versions. |
|
|
|
</li> |
|
|
|
</ul> |
|
|
|
<p> |
|
|
|
These classes are loaded from all the jars present in the <code>$ANT_HOME/lib</code> |
|
|
|
directory. |
|
|
|
</p> |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
The <strong>Container</strong> ClassLoader contains all the classes and resources |
|
|
|
that are part of the actual implementation of the Container. These classes are not |
|
|
|
directly accessible to any Ant library or task. Some of the classes are indirectly |
|
|
|
accessible to tasks and other elements defined in the ant librarys as they implement |
|
|
|
interfaces defined in the <strong>Common</strong> ClassLoader. The classes that are |
|
|
|
stored in jars in the <code>$ANT_HOME/bin/lib/</code> directory. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
The <strong>Shared</strong> ClassLoader contains all the classes and resources |
|
|
|
that are shared across all of the ant librarys (unless they are als needed by the |
|
|
|
container in which case they should be placed int the <strong>Container</strong> |
|
|
|
ClassLoader). This ClassLoader is populated by all the jars that are contained in |
|
|
|
the <code>$ANT_HOME/shared/</code> directory. |
|
|
|
</li> |
|
|
|
<li> |
|
|
|
The <strong>AntLib</strong> ClassLoaders each contain the classes and resources |
|
|
|
that required by that particular library. Note that in some cases a single Ant |
|
|
|
Library will manifest as a single ClassLoader containing a single jar. However |
|
|
|
in some cases it is possible for one Ant Library to have multiple jars in its |
|
|
|
ClassLoader or even have multiple ClassLoaders. See XXXX for further details. |
|
|
|
</li> |
|
|
|
</ul> |
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
</body> |
|
|
|
</document> |