类加载器:每个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()
相关推荐
在Java中,类加载器是JVM的一部分,它的任务是将.class文件从磁盘加载到内存,并使这些类在运行时可用。类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到...
2. Webapp ClassLoader:每个Web应用程序都有自己的Webapp ClassLoader,用于加载WEB-INF/classes和WEB-INF/lib下的类,遵循"父子优先"原则,优先尝试从父类加载器加载,如果找不到再从自身加载。 3. Shared ...
现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...
类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求,而现在它在Web容器和模块化系统如OSGi中扮演着至关重要的角色。 类加载器工作流程通常涉及以下几个步骤: 1. **加载**:加载阶段,类...
现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...
JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对优化应用性能和解决依赖冲突至关重要。 1. JVM类加载器: - **父类加载器**:在Java中,类加载器之间...
- **Web容器中的类隔离**:不同的Web应用部署在同一台服务器上时,每个应用都有自己的类加载器,从而实现了类的隔离。 - **热部署**:通过自定义类加载器实现代码的热更新,无需重启服务即可更新部分类的实现。 - **...
2. 如果父类加载器加载不了该类,则子类加载器才会尝试自己加载。 3. 这种委托行为沿着加载器链向上追溯,最终到达最顶层的启动类加载器。 4. 如果最顶层的启动类加载器也无法加载该类,则会逐级向下传递,直到有...
4. **Webapp ClassLoader**:每个Web应用都有自己的类加载器,负责加载对应Web应用的WEB-INF/classes和WEB-INF/lib目录下的类和JAR文件。这种设计确保了不同Web应用间的类隔离,防止类冲突。 5. **Catalina ...
在这个特定的场景中,我们关注的是版本8.5.87的源代码,并且涉及到类加载器WebappClassLoaderBase的修改,目的是使得Tomcat能够支持加载经过加密的Web项目。 WebappClassLoaderBase是Tomcat中的核心类加载器,它...
`tk-filter` 是一个针对这种需求设计的过滤器(Filter),它适用于各种Web容器,如Tomcat、Jetty等。这个过滤器的主要功能是在Web服务器端对js、jsp和css文件进行压缩,然后再发送到客户端,从而减少网络传输的数据...
随着时间的发展,类加载器在现代Java应用,特别是Web容器和OSGi(Open Services Gateway Initiative)框架中扮演了重要角色。 类加载器的主要任务是将Java字节码(.class文件)加载到Java虚拟机(JVM)中,将其转化...
OSGi基于服务导向架构,其中每个模块(称为bundle)都有自己的类加载器,并通过声明依赖关系来管理与其他模块的交互。这使得在运行时可以动态地安装、启动、停止和更新模块,而不会影响到其他模块。 Tomcat是基于...
总结来说,Spring IOC容器在Web容器中的启动涉及到创建`WebApplicationContext`,加载配置文件中的bean定义,然后通过`refresh()`方法实例化和初始化bean。这个过程确保了Web应用程序能够正确地配置和运行其依赖的...
当我们谈论“加载Spring文件,在web.xml中的配置”时,主要是指如何在Web应用启动时初始化Spring IoC(Inversion of Control,控制反转)容器并加载配置文件。 1. **使用ContextLoaderListener** `<listener>`标签...
在Java中,类加载器(ClassLoader)负责将.class文件加载到JVM中。Tomcat通过自定义的类加载器实现了特定的类加载顺序,以确保能够正确处理不同来源的类文件,避免类的重复加载和类版本冲突问题。以下是Tomcat启动过程...
在Web.xml文件中,配置元素的物理顺序并不影响加载顺序,例如,监听器(Listener)、过滤器(Filter)和Servlet的加载顺序是固定的:`context-param` -> `listener` -> `filter` -> `servlet`。尽管`filter`和`...
本文将深入探讨这个主题,重点关注Web容器如何处理配置文件`web.xml`,以及不同组件(如`context-param`、`listener`、`filter`和`servlet`)的加载顺序。 首先,当一个Web项目启动时,Web容器(如Tomcat、Jetty等...