Java Class Loader
   HOME

TheInfoList



OR:

The Java class loader, part of the
Java Runtime Environment Java is a set of computer software and specifications that provides a software platform for developing application software and deploying it in a cross-platform computing environment. Java is used in a wide variety of computing platforms ...
, dynamically loads
Java class Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, pro ...
es into the
Java Virtual Machine A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode. The JVM is detailed by a specification that formally descr ...
. Usually classes are only loaded
on demand On-demand or on demand may refer to: Manufacturing * Build-on-demand * Just-in-time manufacturing, a methodology for production * Print on demand, printing technology and business process in which new copies of a document are not printed until ...
. The virtual machine will only load the class files required for executing the program. The Java run time system does not need to know about files and file systems as this is delegated to the class loader. A
software library In computing, a library is a collection of resources that can be leveraged during software development to implement a computer program. Commonly, a library consists of executable code such as compiled functions and classes, or a library can ...
is a collection of related
object code In computing, object code or object module is the product of an assembler or compiler In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' ...
. In the Java language, libraries are typically packaged in JAR files. Libraries can contain objects of different types. The most important type of object contained in a Jar file is a
Java class Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, pro ...
. A class can be thought of as a named unit of code. The class loader is responsible for locating libraries, reading their contents, and loading the classes contained within the libraries. This loading is typically done "on demand", in that it does not occur until the class is called by the program. A class with a given name can only be loaded once by a given class loader. Each Java class must be loaded by a class loader. Furthermore,
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
programs may make use of external libraries (that is, libraries written and provided by someone other than the author of the program) or they may be composed, at least in part, of a number of libraries. When the JVM is started, three class loaders are used: # Bootstrap class loader # Extensions class loader # System class loader The bootstrap class loader loads the core Java librariesThese libraries are stored in Jar files called ''rt.jar'', ''core.jar'', ''server.jar'', etc. located in the /jre/lib (or /jmods> for Java 9 and above) directory. This class loader, which is part of the core JVM, is written in native code. The bootstrap class loader is not associated with any object. For instance, returns . The extensions class loader loads the code in the extensions directories (/jre/lib/ext, or any other directory specified by the java.ext.dirs system property). The system class loader loads code found on java.class.path, which maps to the CLASSPATH
environment variable An environment variable is a user-definable value that can affect the way running processes will behave on a computer. Environment variables are part of the environment in which a process runs. For example, a running process can query the va ...
.


User-defined class loaders

The Java class loader is written in Java. It is therefore possible to create a custom class loader without understanding the finer details of the Java Virtual Machine. Apart from the Bootstrap class loader, every Java class loader has a parent class loader. The parent class loader is defined when a new class loader is instantiated or set to the virtual machine's system default class loader. This makes it possible (for example): * to load or unload classes at runtime (for example to load libraries dynamically at runtime, even from an
HTTP HTTP (Hypertext Transfer Protocol) is an application layer protocol in the Internet protocol suite model for distributed, collaborative, hypermedia information systems. HTTP is the foundation of data communication for the World Wide Web, wher ...
resource). This is an important feature for: ** implementing scripting languages, such as Jython ** using
bean A bean is the seed of some plants in the legume family (Fabaceae) used as a vegetable for human consumption or animal feed. The seeds are often preserved through drying (a ''pulse''), but fresh beans are also sold. Dried beans are traditi ...
builders ** allowing user-defined
extensibility Extensibility is a software engineering and systems design principle that provides for future growth. Extensibility is a measure of the ability to extend a system and the level of effort required to implement the extension. Extensions can be t ...
** allowing multiple
namespace In computing, a namespace is a set of signs (''names'') that are used to identify and refer to objects of various kinds. A namespace ensures that all of a given set of objects have unique names so that they can be easily identified. Namespaces ...
s to communicate. This is one of the foundations of CORBA / RMI protocols for example. * to change the way the
bytecode Bytecode (also called portable code or p-code) is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, bytecodes are compact numeric codes, constants, and references (normal ...
is loaded (for example, it is possible to use encrypted Java class bytecode). * to modify the loaded bytecode (for example, for load-time
weaving Weaving is a method of textile production in which two distinct sets of yarns or threads are interlaced at right angles to form a fabric or cloth. Other methods are knitting, crocheting, felting, and braiding or plaiting. The longitudinal ...
of aspects when using aspect-oriented programming).


Class loaders in Jakarta EE

Jakarta EE (formerly Java EE and J2EE) application servers typically load classes from a deployed WAR or EAR archive by a tree of class loaders, isolating the application from other applications, but sharing classes between deployed modules. So-called " servlet containers" are typically implemented in terms of multiple class loaders.


JAR hell

JAR hell is a term similar to DLL hell used to describe all the various ways in which the classloading process can end up not working. Three ways JAR hell can occur are: * Accidental presence of two different versions of a library installed on a system. This will not be considered an error by the system. Rather, the system will load classes from one or the other library. Adding the new library to the list of available libraries instead of replacing it may result in the application still behaving as though the old library is in use, which it may well be. * Multiple libraries or applications require different versions of library foo. If versions of library foo use the same class names, there is no way to load the versions of library foo with the same class loader. * The most complex JAR hell problems arise in circumstances that take advantage of the full complexity of the classloading system. A Java program is not required to use only a single "flat" class loader, but instead may be composed of several (potentially very many) nested, cooperating class loaders. Classes loaded by different class loaders may interact in complex ways not fully comprehended by a developer, leading to errors or bugs that are difficult to analyze, explain, and resolve. The OSGi Alliance specified (starting as JSR 8 in 1998) a modularity framework that aims to solve JAR hell for current and future VMs in ME, SE, and EE that is widely adopted. Using metadata in the JAR manifest, JAR files (called bundles) are wired on a per-package basis. Bundles can export packages, import packages and keep packages private, providing the basic constructs of modularity and versioned dependency management. Java 9 introduced the Java Platform Module System in 2017. This specifies a distribution format for collections of Java code and associated resources. It also specifies a repository for storing these collections, or '' modules'', and identifies how they can be discovered, loaded and checked for integrity. It includes features such as namespaces with the aim of fixing some of the shortcomings in the existing JAR format. The Java Platform Module System follows a different philosophy from the OSGi architecture that aims at providing modularity for the Java Runtime Environment in a backwards-compatible way that uses the default mechanism of loading classes that the JRE provides. However, since the Java Platform Module System does not offer the ability for controlled co-existence of libraries with different versions, it does not fully address the JAR hell problem.


See also

* Loader (computing) * Dynamic loading * DLL hell * OSGi *
Classpath (Java) Classpath is a parameter in the Java Virtual Machine or the Java compiler that specifies the location of user-defined classes and packages. The parameter may be set either on the command-line, or through an environment variable. Overview an ...
* Java Platform Module System


Footnotes


References


External links

* Chuck McManis,
The basics of Java class loaders
, 1996 * Brandon E. Taylor,
Java Class Loading: The Basics
", 2003 * * Jeff Hanson,
Take Control of Class Loading in Java
", 2006-06-01 * Andreas Schaefer,

, 2003-11-12 * Sheng Liang and Gilad Bracha,
Dynamic class loading in the Java virtual machine
, In Proceedings of the 13th ACM Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA'98), ACM SIGPLAN Notices, vol. 33, no. 10, ACM Press, 1998, pp. 36–44 {{doi, 10.1145/286936.286945 * Jeremy Whitlock,

, May 2005 * Christoph G. Jung,
Classloaders Revisited Hotdeploy
, ''Java Specialist Newsletter'', 2001-06-07 * Don Schwarz,

, 2005-04-13 Java (programming language)