Java Classloader
The Java Class Loader is a part of the Java Runtime Environment that dynamically loads Java classes into the Java Virtual Machine. Usually classes are only loaded on demand. 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 is a collection of related object code. 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. 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 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: The bootstrap class loader loads the core Java libraries located in the codice_1 directory. This class loader, which is part of the core JVM, is written in native code. The extensions class loader loads the code in the extensions directories (codice_2, or any other directory specified by the codice_3 system property). The system class loader loads code found on codice_4, which maps to the codice_5 environment variable. User-defined class loaders. The Java class loader is written  in Java. It is therefore possible to create your own class loader without understanding the finer details of the Java Virtual Machine. Every Java class loader has a parent class loader, 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): 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: 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. To remedy the JAR hell problems, a Java Community Process — JSR 277 was initiated in 2005. The resolution — Java Platform Module System — intended to introduce a new distribution format, a modules versioning scheme, and a common modules repository (similar in purpose to Microsoft .NET's Global Assembly Cache). In December 2008, Sun announced that JSR 277 was put on hold. The Java Module System was later rebooted as "project Jigsaw" which was included in Java 9. Released in 2017, it includes support for modular  software, termed "Java Platform Module System", which is controlled on source level with module-info.java files. It 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 it does not offer the ability for controlled co-existence of libraries with different versions, it is not suited for tackling the JAR Hell problem.