资讯专栏INFORMATION COLUMN

Tomcat7---类是怎样被加载的

jollywing / 3057人阅读

摘要:所有这些类对于和应用程序都是可见的。或者日志实现类。其中包括称为的的增强类以及由内部使用的库的软件包重命名副本。这个类加载器搜索的位置由中的属性定义。中的所有其他类加载器都遵循通常的代理模式。

最好先了解Java的双亲委派机制再看这篇文章。
整体架构
      Bootstrap
          |
       System
          |
       Common
       /     
  Webapp1   Webapp2 ...
类加载器定义

Bootstrap 这个类加载器包含Java虚拟机提供的基本运行时类,以及来自System Extensions目录
$JAVA_HOME/jre/lib/ext)中的JAR文件的所有类。注意:有些JVM可能将其实现为多个类加载器,比如HotSpot就分为启动类加载器(Bootstrap ClassLoader)和扩展类加载器(Extension ClassLoader)。

System 这个类加载器通常是通过CLASSPATH环境变量的内容初始化的。 所有这些类对于Tomcat和Web应用程序都是可见的。但是,标准Tomcat启动脚本($CATALINA_HOME/bin/catalina.sh%CATALINA_HOME%incatalina.bat)完全忽略了CLASSPATH环境变量本身的内容,而是从以下存储库(repositories)构建System类加载器:

$CATALINA_HOME/bin/bootstrap.jar:包含用于初始化Tomcat服务器的main()`方法以及它所依赖的类加载器实现类。

$CATALINA_BASE/bin/tomcat-juli.jar或者$CATALINA_HOME/bin/tomcat-juli.jar:日志实现类。其中包括称为Tomcat JULIjava.util.loggingAPI的增强类以及由Tomcat内部使用的ApacheCommons Logging库的软件包重命名副本。

Common
这个类加载器包含了对Tomcat内部类和所有Web应用程序都可见的其他类。通常,应用程序类别不应放置在此处。这个类加载器搜索的位置由$CATALINA_BASE/conf/catalina.properties中的common.loader属性定义。默认设置将按照它们列出的顺序搜索以下位置:

$CATALINA_BASE/lib下没打包的classes和资源文件

$CATALINA_BASE/lib下的jar

$CATALINA_HOME/lib下没打包的classes和资源文件

$CATALINA_HOME/lib下的jar

WebappX 为每个部署在单个Tomcat实例中的Web应用程序创建类加载器。
Web应用程序的/WEB-INF/classes目录中的所有未打包的类和资源,以及Web应用程序的/WEB-INF/lib目录下的JAR文件中的类和资源都可以被此Web应用程序访问,但不能访问到其他的。

如上所述,Web应用程序类加载器与默认的Java委托模型不同(即双亲委派)。当处理从Web应用程序的WebappX类加载器加载类的请求时,该类加载器将首先在本地存储库中查找,而不是在查找之前进行委托。 但是有例外,作为JRE基类的一部分的类不能被覆盖。例如J2SE 1.4+中的XML解析器组件,以及Java 8将会使用的类。最后,包含Servlet API类的任何JAR文件将被类加载器显式忽略 - 你的Web应用程序中不应该包含这些类。 Tomcat中的所有其他类加载器都遵循通常的代理模式。

因此,从Web应用程序的角度来看,类或资源加载按以下顺序在以下存储库中查找:

Bootstrap classes of your JVM

web应用的/WEB-INF/classes

web应用的/WEB-INF/lib/*.jar

System class loader classes (如上所述)

Common class loader classes (如上所述)

如果Web应用程序类加载器配置为,那么顺序将变为:

Bootstrap classes of your JVM

System class loader classes (如上所述)

Common class loader classes (如上所述)

web应用的/WEB-INF/classes

web应用的/WEB-INF/lib/*.jar

资料

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68659.html

相关文章

  • Maven详细教程

    摘要:清理上一次执行创建的文件处理资源文件编译代码执行单元测试文件创建拷贝到本地的仓库下面发布生成文档将工程所有文档生成网站,生成的网站界面默认和的项目站点类似,但是其文档用格式写的,目前不支持,需要用其他插件配合才能支持。 前言 本文可以帮助你加深对Maven的整体认识,不是一篇基础文章。如果你现在还没有用 Maven 跑过 HelloWorld,那么本文可能不适合你。 一、Maven简介...

    Keagan 评论0 收藏0
  • 《转载》经典Java基础面试题集锦

    摘要:经典的基础面试题集锦经典的基础面试题集锦,欢迎收藏和分享。类变量或者说静态变量是通过这个关键字来声明的。非静态变量在每一个对象实例上都有单独的一份值。对象允许程序和数据进行封装,以减少潜在的干涉。 经典的Java基础面试题集锦 经典的Java基础面试题集锦,欢迎收藏和分享。 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示main方法不是pub...

    Winer 评论0 收藏0

发表评论

0条评论

jollywing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<