Used to load classes within ant with a different classpath from
that used to start ant. Note that it is possible to force a class
into this loader even when that class is on the system classpath by
using the forceLoadClass method. Any subsequent classes loaded by that
class will then use this loader rather than the system class loader.
Note that this classloader has a feature to allow loading
in reverse order and for "isolation".
Due to the fact that a number of
methods in java.lang.ClassLoader are final (at least
in java 1.4 getResources) this means that the
class has to fake the given parent.
AntClassLoader
public AntClassLoader()
Create an Ant Class Loader
AntClassLoader
public AntClassLoader(ClassLoader parent,
boolean parentFirst)
Creates an empty class loader. The classloader should be configured
with path elements to specify where the loader is to look for
classes.
parent
- The parent classloader to which unsatisfied loading
attempts are delegated. May be null
,
in which case the classloader which loaded this
class is used as the parent.parentFirst
- If true
, indicates that the parent
classloader should be consulted before trying to
load the a class through this loader.
AntClassLoader
public AntClassLoader(ClassLoader parent,
Project project,
Path classpath)
Create an Ant ClassLoader for a given project, with
a parent classloader and an initial classpath.
parent
- the parent for this classloader.project
- The project to which this classloader is to
belong.classpath
- The classpath to use to load classes.
AntClassLoader
public AntClassLoader(ClassLoader parent,
Project project,
Path classpath,
boolean parentFirst)
Creates a classloader for the given project using the classpath given.
parent
- The parent classloader to which unsatisfied loading
attempts are delegated. May be null
,
in which case the classloader which loaded this
class is used as the parent.project
- The project to which this classloader is to belong.
Must not be null
.classpath
- the classpath to use to load the classes.
May be null
, in which case no path
elements are set up to start with.parentFirst
- If true
, indicates that the parent
classloader should be consulted before trying to
load the a class through this loader.
AntClassLoader
public AntClassLoader(Project project,
Path classpath)
Creates a classloader for the given project using the classpath given.
project
- The project to which this classloader is to belong.
Must not be null
.classpath
- The classpath to use to load the classes. This
is combined with the system classpath in a manner
determined by the value of ${build.sysclasspath}.
May be null
, in which case no path
elements are set up to start with.
AntClassLoader
public AntClassLoader(Project project,
Path classpath,
boolean parentFirst)
Creates a classloader for the given project using the classpath given.
project
- The project to which this classloader is to belong.
Must not be null
.classpath
- The classpath to use to load the classes. May be
null
, in which case no path
elements are set up to start with.parentFirst
- If true
, indicates that the parent
classloader should be consulted before trying to
load the a class through this loader.
addJavaLibraries
public void addJavaLibraries()
add any libraries that come with different java versions
here
addLoaderPackageRoot
public void addLoaderPackageRoot(String packageRoot)
Adds a package root to the list of packages which must be loaded using
this loader.
All subpackages are also included.
packageRoot
- The root of all packages to be included.
Should not be null
.
addPathElement
public void addPathElement(String pathElement)
throws BuildException
Adds an element to the classpath to be searched.
pathElement
- The path element to add. Must not be
null
.
BuildException
- if the given path element cannot be resolved
against the project.
addPathFile
protected void addPathFile(File pathComponent)
throws IOException
Add a file to the path.
Reads the manifest, if available, and adds any additional class path jars
specified in the manifest.
pathComponent
- the file which is to be added to the path for
this class loader
addSystemPackageRoot
public void addSystemPackageRoot(String packageRoot)
Adds a package root to the list of packages which must be loaded on the
parent loader.
All subpackages are also included.
packageRoot
- The root of all packages to be included.
Should not be null
.
buildFinished
public void buildFinished(BuildEvent event)
Cleans up any resources held by this classloader at the end
of a build.
- buildFinished in interface BuildListener
event
- the buildFinished event
buildStarted
public void buildStarted(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- buildStarted in interface BuildListener
event
- the buildStarted event
cleanup
public void cleanup()
Cleans up any resources held by this classloader. Any open archive
files are closed.
defineClassFromData
protected Class defineClassFromData(File container,
byte[] classData,
String classname)
throws IOException
Define a class given its bytes
container
- the container from which the class data has been read
may be a directory or a jar/zip file.classData
- the bytecode data for the classclassname
- the name of the class
- the Class instance created from the given data
definePackage
protected void definePackage(File container,
String className)
throws IOException
Define the package information associated with a class.
container
- the file containing the class definition.className
- the class name of for which the package information
is to be determined.
definePackage
protected void definePackage(File container,
String packageName,
Manifest manifest)
Define the package information when the class comes from a
jar with a manifest
container
- the jar file containing the manifestpackageName
- the name of the package being defined.manifest
- the jar's manifest
findClass
public Class findClass(String name)
throws ClassNotFoundException
Searches for and load a class on the classpath of this class loader.
name
- The name of the class to be loaded. Must not be
null
.
- the required Class object
findResources
protected Enumeration findResources(String name)
throws IOException
Returns an enumeration of URLs representing all the resources with the
given name by searching the class loader's classpath.
name
- The resource name to search for.
Must not be null
.
- an enumeration of URLs for the resources
forceLoadClass
public Class forceLoadClass(String classname)
throws ClassNotFoundException
Loads a class through this class loader even if that class is available
on the parent classpath.
This ensures that any classes which are loaded by the returned class
will use this classloader.
classname
- The name of the class to be loaded.
Must not be null
.
- the required Class object
forceLoadSystemClass
public Class forceLoadSystemClass(String classname)
throws ClassNotFoundException
Loads a class through this class loader but defer to the parent class
loader.
This ensures that instances of the returned class will be compatible
with instances which have already been loaded on the parent
loader.
classname
- The name of the class to be loaded.
Must not be null
.
- the required Class object
getClasspath
public String getClasspath()
Returns the classpath this classloader will consult.
- the classpath used for this classloader, with elements
separated by the path separator for the system.
getResource
public URL getResource(String name)
Finds the resource with the given name. A resource is
some data (images, audio, text, etc) that can be accessed by class
code in a way that is independent of the location of the code.
name
- The name of the resource for which a stream is required.
Must not be null
.
- a URL for reading the resource, or
null
if the
resource could not be found or the caller doesn't have
adequate privileges to get the resource.
getResourceAsStream
public InputStream getResourceAsStream(String name)
Returns a stream to read the requested resource name.
name
- The name of the resource for which a stream is required.
Must not be null
.
- a stream to the required resource or
null
if the
resource cannot be found on the loader's classpath.
getResourceURL
protected URL getResourceURL(File file,
String resourceName)
Returns the URL of a given resource in the given file which may
either be a directory or a zip file.
file
- The file (directory or jar) in which to search for
the resource. Must not be null
.resourceName
- The name of the resource for which a stream
is required. Must not be null
.
- a stream to the required resource or
null
if the
resource cannot be found in the given file object.
initializeClass
public static void initializeClass(Class theClass)
since 1.6.x.
Use Class.forName with initialize=true instead.
Forces initialization of a class in a JDK 1.1 compatible, albeit hacky
way.
theClass
- The class to initialize.
Must not be null
.
isInPath
protected boolean isInPath(File component)
Indicate if the given file is in this loader's path
component
- the file which is to be checked
- true if the file is in the class path
loadClass
protected Class loadClass(String classname,
boolean resolve)
throws ClassNotFoundException
Loads a class with this class loader.
This class attempts to load the class in an order determined by whether
or not the class matches the system/loader package lists, with the
loader package list taking priority. If the classloader is in isolated
mode, failure to load the class in this loader will result in a
ClassNotFoundException.
classname
- The name of the class to be loaded.
Must not be null
.resolve
- true
if all classes upon which this class
depends are to be loaded.
- the required Class object
log
protected void log(String message,
int priority)
Logs a message through the project object if one has been provided.
message
- The message to log.
Should not be null
.priority
- The logging priority of the message.
messageLogged
public void messageLogged(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- messageLogged in interface BuildListener
event
- the messageLogged event
resetThreadContextLoader
public void resetThreadContextLoader()
Resets the current thread's context loader to its original value.
setClassPath
public void setClassPath(Path classpath)
Set the classpath to search for classes to load. This should not be
changed once the classloader starts to server classes
classpath
- the search classpath consisting of directories and
jar/zip files.
setIsolated
public void setIsolated(boolean isolated)
Sets whether this classloader should run in isolated mode. In
isolated mode, classes not found on the given classpath will
not be referred to the parent class loader but will cause a
ClassNotFoundException.
isolated
- Whether or not this classloader should run in
isolated mode.
setParent
public void setParent(ClassLoader parent)
Set the parent for this class loader. This is the class loader to which
this class loader will delegate to load classes
parent
- the parent class loader.
setParentFirst
public void setParentFirst(boolean parentFirst)
Control whether class lookup is delegated to the parent loader first
or after this loader. Use with extreme caution. Setting this to
false violates the class loader hierarchy and can lead to Linkage errors
parentFirst
- if true, delegate initial class search to the parent
classloader.
setProject
public void setProject(Project project)
Set the project associated with this class loader
project
- the project instance
setThreadContextLoader
public void setThreadContextLoader()
Sets the current thread's context loader to this classloader, storing
the current loader value for later resetting.
subBuildFinished
public void subBuildFinished(BuildEvent event)
Cleans up any resources held by this classloader at the end of
a subbuild if it has been created for the subbuild's project
instance.
- subBuildFinished in interface SubBuildListener
event
- the buildFinished event
targetFinished
public void targetFinished(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- targetFinished in interface BuildListener
event
- the targetFinished event
targetStarted
public void targetStarted(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- targetStarted in interface BuildListener
event
- the targetStarted event
taskFinished
public void taskFinished(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- taskFinished in interface BuildListener
event
- the taskFinished event
taskStarted
public void taskStarted(BuildEvent event)
Empty implementation to satisfy the BuildListener interface.
- taskStarted in interface BuildListener
event
- the taskStarted event
toString
public String toString()
Returns a String
representing this loader.
- the path that this classloader has.