| <?xml version="1.0"?> |
| <!-- |
| 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. |
| --> |
| <!DOCTYPE document [ |
| <!ENTITY project SYSTEM "project.xml"> |
| ]> |
| <document url="class-loader-howto.html"> |
| |
| &project; |
| |
| <properties> |
| <author email="craigmcc@apache.org">Craig R. McClanahan</author> |
| <author email="yoavs@apache.org">Yoav Shapira</author> |
| <title>Class Loader HOW-TO</title> |
| </properties> |
| |
| <body> |
| |
| <section name="Table of Contents"> |
| <toc/> |
| </section> |
| |
| <section name="Quick Start"> |
| |
| <p>The following rules cover about 95% of the decisions that application |
| developers and deployers must make about where to place class and resource |
| files to make them available to web applications:</p> |
| <ul> |
| <li>For classes and resources specific to a particular web application, |
| place unpacked classes and resources under <code>/WEB-INF/classes</code> |
| of your web application archive, or place JAR files containing those |
| classes and resources under <code>/WEB-INF/lib</code> of your web |
| application archive.</li> |
| <li>For classes and resources that must be shared across all web applications, |
| place unpacked classes and resources under |
| <code>$CATALINA_BASE/shared/classes</code>, or place JAR files |
| containing those classes and resources under |
| <code>$CATALINA_BASE/shared/lib</code>.</li> |
| </ul> |
| |
| </section> |
| |
| |
| <section name="Overview"> |
| |
| <p>Like many server applications, Tomcat 5 installs a variety of class loaders |
| (that is, classes that implement <code>java.lang.ClassLoader</code>) to allow |
| different portions of the container, and the web applications running on the |
| container, to have access to different repositories of available classes and |
| resources. This mechanism is used to provide the functionality defined in the |
| Servlet Specification, version 2.4 -- in particular, Sections 9.4 and 9.6.</p> |
| |
| <p>In a J2SE 2 (that is, J2SE 1.2 or later) environment, class loaders are |
| arranged in a parent-child tree. Normally, when a class loader is asked to |
| load a particular class or resource, it delegates the request to a parent |
| class loader first, and then looks in its own repositories only if the parent |
| class loader(s) cannot find the requested class or resource. The model for |
| web application class loaders differs slightly from this, as discussed below, |
| but the main principles are the same.</p> |
| |
| <p>When Tomcat 5 is started, it creates a set of class loaders that are |
| organized into the following parent-child relationships, where the parent |
| class loader is above the child class loader:</p> |
| |
| <source> |
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
| / \ |
| Webapp1 Webapp2 ... |
| </source> |
| |
| <p>The characteristics of each of these class loaders, including the source |
| of classes and resources that they make visible, are discussed in detail in |
| the following section.</p> |
| |
| </section> |
| |
| <section name="Class Loader Definitions"> |
| |
| <p>As indicated in the diagram above, Tomcat 5 creates the following class |
| loaders as it is initialized:</p> |
| <ul> |
| <li><strong>Bootstrap</strong> - This class loader contains the basic runtime |
| classes provided by the Java Virtual Machine, plus any classes from JAR |
| files present in the System Extensions directory |
| (<code>$JAVA_HOME/jre/lib/ext</code>). <em>NOTE</em> - Some JVMs may |
| implement this as more than one class loader, or it may not be visible |
| (as a class loader) at all.</li> |
| <li><strong>System</strong> - This class loader is normally initialized from |
| the contents of the <code>CLASSPATH</code> environment variable. All such |
| classes are visible to both Tomcat internal classes, and to web |
| applications. However, the standard Tomcat 5 startup scripts |
| (<code>$CATALINA_HOME/bin/catalina.sh</code> or |
| <code>%CATALINA_HOME%\bin\catalina.bat</code>) totally ignore the contents |
| of the <code>CLASSPATH</code> environment variable itself, and instead |
| build the System class loader from the following repositories: |
| <ul> |
| <li><em>$CATALINA_HOME/bin/bootstrap.jar</em> - Contains the main() method |
| that is used to initialize the Tomcat 5 server, and the class loader |
| implementation classes it depends on.</li> |
| <li><em>$JAVA_HOME/lib/tools.jar</em> - Contains the "javac" compiler used |
| to convert JSP pages into servlet classes.</li> |
| <li><em>$CATALINA_HOME/bin/commons-logging-api-x.y.z.jar</em> - Jakarta |
| commons logging API.</li> |
| <li><em>$CATALINA_HOME/bin/commons-daemon.jar</em> - Jakarta commons |
| daemon API.</li> |
| <li><em>jmx.jar</em> - The JMX 1.2 implementation.</li> |
| </ul></li> |
| <li><strong>Common</strong> - This class loader contains additional classes |
| that are made visible to both Tomcat internal classes and to all web |
| applications. Normally, application classes should <strong>NOT</strong> |
| be placed here. All unpacked classes and resources in |
| <code>$CATALINA_HOME/common/classes</code>, as well as classes and |
| resources in JAR files under the |
| <code>$CATALINA_HOME/commons/endorsed</code>, |
| <code>$CATALINA_HOME/commons/i18n</code> and |
| <code>$CATALINA_HOME/common/lib</code> directories, |
| are made visible through this |
| class loader. By default, that includes the following: |
| <ul> |
| <li><em>commons-el.jar</em> - Jakarta commons el, implementing the |
| expression language used by Jasper.</li> |
| <li><em>ecj-x.y.x.jar</em> - The Eclipse JDT Java compiler.</li> |
| <li><em>jasper-compiler.jar</em> - The JSP 2.0 compiler.</li> |
| <li><em>jasper-runtime.jar</em> - The JSP 2.0 runtime.</li> |
| <li><em>jsp-api.jar</em> - The JSP 2.0 API.</li> |
| <li><em>naming-common.jar</em> - The JNDI implementation used by Tomcat 5 |
| to represent in-memory naming contexts.</li> |
| <li><em>naming-factory.jar</em> - The JNDI implementation used by Tomcat 5 |
| to resolve references to enterprise resources (EJB, connection |
| pools).</li> |
| <li><em>naming-factory-dbcp.jar</em> - Jakarta commons DBCP, providing a |
| JDBC connection pool to web applications. The classes have been moved |
| out of their default org.apache.commons package.</li> |
| <li><em>naming-java.jar</em> - Handler for the java: namespace.</li> |
| <li><em>naming-resources.jar</em> - The specialized JNDI naming context |
| implementation used to represent the static resources of a web |
| application. This is not related to the support of the J2EE ENC, and |
| cannot be removed.</li> |
| <li><em>servlet-api.jar</em> - The Servlet 2.4 API.</li> |
| <li><em>tomcat-i18n-**.jar</em> - Optional JARs containing resource bundles |
| for other languages. As default bundles are also included in each |
| individual JAR, they can be safely removed if no internationalization |
| of messages is needed.</li> |
| </ul></li> |
| <li><strong>Catalina</strong> - This class loader is initialized to include |
| all classes and resources required to implement Tomcat 5 itself. These |
| classes and resources are <strong>TOTALLY</strong> invisible to web |
| applications. All unpacked classes and resources in |
| <code>$CATALINA_HOME/server/classes</code>, as well as classes and |
| resources in JAR files under |
| <code>$CATALINA_HOME/server/lib</code>, are made visible through |
| this class loader. By default, that includes the following: |
| <ul> |
| <li><em>catalina.jar</em> - Implementation of the Catalina servlet |
| container portion of Tomcat 5.</li> |
| <li><em>catalina-ant.jar</em> - Some Ant tasks which can be used to |
| manage Tomcat using the manager web application.</li> |
| <li><em>catalina-optional.jar</em> - Some optional components of |
| Catalina.</li> |
| <li><em>commons-modeler.jar</em> - A model MBeans implementation used |
| by Tomcat to expose its internal objects through JMX.</li> |
| <li><em>servlets-xxxxx.jar</em> - The classes associated with each |
| internal servlet that provides part of Tomcat's functionality. |
| These are separated so that they can be completely removed if the |
| corresponding service is not required, or they can be subject to |
| specialized security manager permissions.</li> |
| <li><em>tomcat-coyote.jar</em> - Coyote API.</li> |
| <li><em>tomcat-http.jar</em> - Standalone Java HTTP/1.1 |
| connector.</li> |
| <li><em>tomcat-ajp.jar</em> - Classes for the Java portion of the |
| <code>AJP</code> web server connector, which allows Tomcat to |
| run behind web servers such as Apache and iPlanet iAS and iWS.</li> |
| <li><em>tomcat-util.jar</em> - Utility classes required by some |
| Tomcat connectors.</li> |
| </ul></li> |
| <li><strong>Shared</strong> - This class loader is the place to put classes |
| and resources that you wish to share across <strong>ALL</strong> |
| web applications (unless Tomcat internal classes also need access, |
| in which case you should put them in the <strong>Common</strong> |
| class loader instead). All unpacked classes and resources in |
| <code>$CATALINA_BASE/shared/classes</code>, as well as classes and |
| resources in JAR files under <code>$CATALINA_BASE/shared/lib</code>, are |
| made visible through this class loader. If multiple Tomcat instances are |
| run from the same binary using the $CATALINA_BASE environment variable, |
| then this classloader repositories are relative to $CATALINA_BASE rather |
| than $CATALINA_HOME.</li> |
| <li><strong>WebappX</strong> - A class loader is created for each web |
| application that is deployed in a single Tomcat 5 instance. All unpacked |
| classes and resources in the <code>/WEB-INF/classes</code> directory of |
| your web application archive, plus classes and resources in JAR files |
| under the <code>/WEB-INF/lib</code> directory of your web application |
| archive, are made visible to the containing web application, but to |
| no others.</li> |
| </ul> |
| |
| <p>As mentioned above, the web application class loader diverges from the |
| default Java 2 delegation model (in accordance with the recommendations in the |
| Servlet Specification, version 2.3, section 9.7.2 Web Application Classloader). |
| When a request to load a |
| class from the web application's <em>WebappX</em> class loader is processed, |
| this class loader will look in the local repositories <strong>first</strong>, |
| instead of delegating before looking. There are exceptions. Classes which are |
| part of the JRE base classes cannot be overriden. For some classes (such as |
| the XML parser components in J2SE 1.4+), the J2SE 1.4 endorsed feature can be |
| used |
| (see the common classloader definition above). |
| Last, any JAR containing servlet API classes will be ignored by the |
| classloader. |
| All other class loaders in Tomcat 5 follow the usual delegation pattern.</p> |
| |
| <p>Therefore, from the perspective of a web application, class or resource |
| loading looks in the following repositories, in this order:</p> |
| <ul> |
| <li>Bootstrap classes of your JVM</li> |
| <li>System class loader classes (described above)</li> |
| <li><em>/WEB-INF/classes</em> of your web application</li> |
| <li><em>/WEB-INF/lib/*.jar</em> of your web application</li> |
| <li><em>$CATALINA_HOME/common/classes</em></li> |
| <li><em>$CATALINA_HOME/common/endorsed/*.jar</em></li> |
| <li><em>$CATALINA_HOME/common/i18n/*.jar</em></li> |
| <li><em>$CATALINA_HOME/common/lib/*.jar</em></li> |
| <li><em>$CATALINA_BASE/shared/classes</em></li> |
| <li><em>$CATALINA_BASE/shared/lib/*.jar</em></li> |
| </ul> |
| |
| </section> |
| |
| |
| <section name="XML Parsers and J2SE 1.4"> |
| |
| <p>Among many other changes, the J2SE 1.4 release packages the JAXP APIs, and |
| a version of Xerces, inside the JRE. This has impacts on applications that |
| wish to use their own XML parser.</p> |
| |
| <p>In previous versions of Tomcat 5, you could simply replace the XML parser |
| in the <code>$CATALINA_HOME/common/lib</code> directory to change the parser |
| used by all web applications. However, this technique will not be effective |
| when you are running on J2SE 1.4, because the usual class loader delegation |
| process will always choose the implementation inside the JDK in preference |
| to this one.</p> |
| |
| <p>JDK 1.4 supports a mechanism called the "Endorsed Standards Override |
| Mechanism" to allow replacement of APIs created outside of the JCP (i.e. |
| DOM and SAX from W3C). It can also be used to update the XML parser |
| implementation. For more information, see: |
| <a href="http://java.sun.com/j2se/1.4/docs/guide/standards/index.html"> |
| http://java.sun.com/j2se/1.4/docs/guide/standards/index.html</a>.</p> |
| |
| <p>Tomcat utilizes this mechanism by including the system property setting |
| <code>-Djava.endorsed.dirs=$CATALINA_HOME/common/endorsed</code> in the |
| command line that starts the container. Therefore, you can replace the |
| parser that is installed in this directory, and it will get used even on a |
| JDK 1.4 system.</p> |
| |
| </section> |
| |
| |
| <section name="Running under a security manager"> |
| |
| <p>When running under a security manager the locations from which classes |
| are permitted to be loaded will also depend on the contents of your policy |
| file. See <a href="security-manager-howto.html">Security Manager HOW-TO</a> |
| for further information.</p> |
| |
| </section> |
| |
| |
| </body> |
| |
| </document> |