`
SwordShadow
  • 浏览: 271000 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

web容器中的类加载器加载文件

    博客分类:
  • java
阅读更多

类加载器:每个Class对象都保留着加载自己的类加载器的引用,可以通过Class对象的getClassLoader方法来获得其引用。ClassLoader通过loadClass方法来加载这个类。

 

按照类加载器,首先应该加载父类,也就是通常所说的父类优先的原则,但是在web容器中加载顺序有所不同。

 

 

 

 

通过查找资料找到这样的叙述:

 

对于运行在 Java EE容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

 

绝大多数情况下,Web 应用的开发人员不需要考虑与类加载器相关的细节。下面给出几条简单的原则:

 

 

每个 Web 应用自己的 Java 类文件和使用的库的 jar 包,分别放在 WEB-INF/classes和 WEB-INF/lib目录下面。

多个应用共享的 Java 类文件和 jar 包,分别放在 Web 容器指定的由所有 Web 应用共享的目录下面。

当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。

 

 

于是对于一个普通web项目,properties文件可以放在src目录下,经过编译器编译之后目录变为WEB-INF/classes目录.

java web项目部署到tomcat后根目录如下

| --META-INF
  --WEB-INF       -->包含  classess、lib文件夹和web.xml文件,

     index.jsp

 

classes包含编译后的.class文件和配置文件

 

 

 

 

路径变化后,只能通过类加载器来获得文件路径,否则无法加载。

 

serlvet中加载配置文件,此时ServletContext为根目录

public void init() throws ServletException {
        //web容器为根目录
	InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/info.properties");
	Properties pro = new Properties();  
	try {
		pro.load(in);
	} catch (IOException e) {
		log.error("读取info.properties失败"+e.getMessage());
	} 	
	super.init();	
}

 

如果在其它类可以使用getClass().getClassLoader().getResourceAsStream(filePath)  ,此时classes目录为根目录:classPath

	InputStream is = null;
	Properties pro = new Properties();
	is = getClass().getClassLoader().getResourceAsStream("/info.properties");  //无论要查找的资源前面是否带'/' 都会从classpath的根路径下查找。
	pro.load(is);
	Enumeration e = pro.propertyNames();
	while (e.hasMoreElements()) {
		String key = (String) e.nextElement();
		String value = (String) pro.get(key);
		proMap.put(key, value);
	}
	is.close();

 注意:getClass().getClassLoader().getResourceAsStream()  与 getClass().getResourceAsStream() 区别  参考stackoverflow:link1  link2

 

 

Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致。

例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.class.getResourceAsStream("name") 会在com.test.mycode包下查找相应的资源。

如果这个name是以 '/' 开头的,那么就会从classpath的根路径下开始查找。

 

 

 

参考:从读取properties文件说开去,浅谈web容器中类加载器     关于servlet中properties配置文件的存放位置    JAVA 笔记xx.getClass().getClassLoader().getResourceAsStream()

 

  • 大小: 3.8 KB
  • 大小: 50.3 KB
1
0
分享到:
评论

相关推荐

    tomcat类加载器

    在Java中,类加载器是JVM的一部分,它的任务是将.class文件从磁盘加载到内存,并使这些类在运行时可用。类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到...

    java类加载器-tomcat中的类加载器

    2. Webapp ClassLoader:每个Web应用程序都有自己的Webapp ClassLoader,用于加载WEB-INF/classes和WEB-INF/lib下的类,遵循"父子优先"原则,优先尝试从父类加载器加载,如果找不到再从自身加载。 3. Shared ...

    java类加载器实例

    现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...

    深入探讨 Java 类加载器

    类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求,而现在它在Web容器和模块化系统如OSGi中扮演着至关重要的角色。 类加载器工作流程通常涉及以下几个步骤: 1. **加载**:加载阶段,类...

    ClassLoader类加载机制

    现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...

    JVM、Tomcat、OSGI等类加载器整理文档

    JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对优化应用性能和解决依赖冲突至关重要。 1. JVM类加载器: - **父类加载器**:在Java中,类加载器之间...

    深入研究Java类加载机制 深入研究Java类加载机制

    - **Web容器中的类隔离**:不同的Web应用部署在同一台服务器上时,每个应用都有自己的类加载器,从而实现了类的隔离。 - **热部署**:通过自定义类加载器实现代码的热更新,无需重启服务即可更新部分类的实现。 - **...

    深入探讨 Java 类加载器.pdf

    2. 如果父类加载器加载不了该类,则子类加载器才会尝试自己加载。 3. 这种委托行为沿着加载器链向上追溯,最终到达最顶层的启动类加载器。 4. 如果最顶层的启动类加载器也无法加载该类,则会逐级向下传递,直到有...

    tomcat 类加载机制 —— ClassLoader

    4. **Webapp ClassLoader**:每个Web应用都有自己的类加载器,负责加载对应Web应用的WEB-INF/classes和WEB-INF/lib目录下的类和JAR文件。这种设计确保了不同Web应用间的类隔离,防止类冲突。 5. **Catalina ...

    apache-tomcat-8.5.87-src 类加载器WebappClassLoaderBase修改,web项目加密解密

    在这个特定的场景中,我们关注的是版本8.5.87的源代码,并且涉及到类加载器WebappClassLoaderBase的修改,目的是使得Tomcat能够支持加载经过加密的Web项目。 WebappClassLoaderBase是Tomcat中的核心类加载器,它...

    web容器文件压缩 tk-filter tk-filter js,jsp,css,文件压缩包含源代码

    `tk-filter` 是一个针对这种需求设计的过滤器(Filter),它适用于各种Web容器,如Tomcat、Jetty等。这个过滤器的主要功能是在Web服务器端对js、jsp和css文件进行压缩,然后再发送到客户端,从而减少网络传输的数据...

    类加载机制1

    随着时间的发展,类加载器在现代Java应用,特别是Web容器和OSGi(Open Services Gateway Initiative)框架中扮演了重要角色。 类加载器的主要任务是将Java字节码(.class文件)加载到Java虚拟机(JVM)中,将其转化...

    osgi 在web容器中部署

    OSGi基于服务导向架构,其中每个模块(称为bundle)都有自己的类加载器,并通过声明依赖关系来管理与其他模块的交互。这使得在运行时可以动态地安装、启动、停止和更新模块,而不会影响到其他模块。 Tomcat是基于...

    ioc容器在Web容器中的启动.pdf

    总结来说,Spring IOC容器在Web容器中的启动涉及到创建`WebApplicationContext`,加载配置文件中的bean定义,然后通过`refresh()`方法实例化和初始化bean。这个过程确保了Web应用程序能够正确地配置和运行其依赖的...

    加载spring 文件,在web.xml中的配置

    当我们谈论“加载Spring文件,在web.xml中的配置”时,主要是指如何在Web应用启动时初始化Spring IoC(Inversion of Control,控制反转)容器并加载配置文件。 1. **使用ContextLoaderListener** `<listener>`标签...

    Tomcat启动时类加载顺序

    在Java中,类加载器(ClassLoader)负责将.class文件加载到JVM中。Tomcat通过自定义的类加载器实现了特定的类加载顺序,以确保能够正确处理不同来源的类文件,避免类的重复加载和类版本冲突问题。以下是Tomcat启动过程...

    web.xml文件加载顺序[归纳].pdf

    在Web.xml文件中,配置元素的物理顺序并不影响加载顺序,例如,监听器(Listener)、过滤器(Filter)和Servlet的加载顺序是固定的:`context-param` -> `listener` -> `filter` -> `servlet`。尽管`filter`和`...

    web项目的启动时文件加载顺序1

    本文将深入探讨这个主题,重点关注Web容器如何处理配置文件`web.xml`,以及不同组件(如`context-param`、`listener`、`filter`和`servlet`)的加载顺序。 首先,当一个Web项目启动时,Web容器(如Tomcat、Jetty等...

Global site tag (gtag.js) - Google Analytics