tomcat8.5类加载机制
所属分类 tomcat
浏览量 1847
https://tomcat.apache.org/tomcat-8.5-doc/class-loader-howto.html
双亲委托
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.
加载类时先委托给父加载器加载,加载不到再自己加载
Bootstrap
|
System
|
Common
/ \
Webapp1 Webapp2 ...
Bootstrap
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 ($JAVA_HOME/jre/lib/ext).
System
This class loader is normally initialized from the contents of the CLASSPATH environment variable.
All such classes are visible to both Tomcat internal classes, and to web applications.
the standard Tomcat startup scripts (bin/catalina.sh ) totally ignore the contents of the CLASSPATH environment variable itself,
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
bin/bootstrap.jar
Contains the main() method that is used to initialize the Tomcat server,
and the class loader implementation classes it depends on.
bin/tomcat-juli.jar
Logging implementation classes
启动脚本忽略classpath 设置, 需要的话使用 bin/setenv.sh 设置
Common
This class loader contains additional classes that are made visible to both Tomcat internal classes and to all web applications.
application classes should NOT be placed here.
应用类不应该放在这里
The locations searched by this class loader are defined by the common.loader property in $CATALINA_BASE/conf/catalina.properties
搜索路径由 catalina.properties 里的 common.loader 定义
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
WebappX
web 应用加载器
/WEB-INF/classes
/WEB-INF/lib
the web application class loader diverges from the default Java delegation model
(in accordance with the recommendations in the Servlet Specification, version 2.4, section 9.7.2 Web Application Classloader).
When a request to load a class from the web application's WebappX class loader is processed,
this class loader will look in the local repositories first, instead of delegating before looking.
web应用程序类加载器与默认的Java委托模型不同(根据Servlet规范2.4版9.7.2节中的建议)。
web应用类加载器加载类时,首先查看本地库,而不是委托给父加载器加载。
tomcat 类加载顺序
Bootstrap classes of your JVM
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
System class loader classes
Common class loader classes
这个加载顺序可以配置
contex.xml中添加 Loader delegate="true"
先委托给父加载器加载 ,加载顺序变为
Bootstrap classes of your JVM
System class loader classes (described above)
Common class loader classes (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
Starting with Java 1.4 a copy of JAXP APIs and an XML parser are packed inside the JRE.
This has impacts on applications that wish to use their own XML parser.
In old versions of Tomcat, you could simply replace the XML parser in the Tomcat libraries directory
to change the parser used by all web applications.
However, this technique will not be effective when you are running modern versions of Java,
because the usual class loader delegation process will always choose the implementation inside the JDK in preference to this one.
在Tomcat的旧版本中,可以简单地替换Tomcat libraries目录中的XML解析器,更改所有web应用程序使用的解析器。
但是,运行现代版本的Java时,这种技术将不会有效,
因为通常的类加载器委托过程总是优先选择JDK中的实现。
Java <= 8 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: http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html.
For Java 9+, use the upgradeable modules feature.
Endorsed Standards Override Mechanism
认可的标准覆盖机制
Tomcat utilizes the endorsed mechanism by including the system property setting -Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS
$CATALINA_HOME/endorsed
java endorsed 覆盖系统类
-Djava.endorsed.dirs
$JAVA_HOME/jre/lib/endorsed
java.lang 中的类不能被覆盖
Java9 不支持 -Djava.endorsed.dirs
Endorsed standards and standalone APIs in modular form will be supported via the concept of upgradeable modules.
更复杂的类加载器结构
A more complex class loader hierarchy may also be configured.
conf/catalina.properties
server.loader
shared.loader
Bootstrap
|
System
|
Common
/ \
Server Shared
/ \
Webapp1 Webapp2 ...
server loader 对 webapps 不可见
The Server class loader is only visible to Tomcat internals and is completely invisible to web applications.
The Shared class loader is visible to all web applications and may be used to shared code across all web applications.
However, any updates to this shared code will require a Tomcat restart.
上一篇
下一篇
rust特点及安装
maven命令行运行main方法
tomcat8.5压测记录
tomcat8.5嵌入式启动
tomcat8.5架构概述
tomcat8.5启动过程远程调试