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

类加载器:每个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()

 

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键) 1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。 阅读详情

相关推荐

Multisim14安装失败?手把手教你彻底清理残留文件(附专用卸载工具)

本文针对Multisim14安装失败问题,提供了一套从根源解决的完整方案。文章详细分析了安装失败的三大元凶——文件残留、注册表残留和隐藏组件,并手把手指导用户使用专用卸载工具进行标准化清理,再结合手动深度清理文件系统和注册表,最终实现彻底卸载和完美重装,有效解决Multisim14安装问题。

weixin_29179311的博客 317

java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置。 参考配置如下: http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/

feng200711021053的专栏 1万+

AI漫剧实战:MiniMaxH3本地部署+ComfyUI工作流,6G显存出长视频

随着AI视频生成技术的普及,创作者开始追求在有限硬件条件下的本地化部署。本地部署不仅降低使用成本,更能获得对生成流程的完全可控性,这为高频次的内容生产提供了基础。以开源工作流引擎ComfyUI为依托,通过量化模型与显存优化,即便是6G显存的中端显卡也能流畅运行MiniMaxH3视频生成模型,输出60秒级别的AI漫剧片段。本文从视频生成原理出发,讲解模型选择、节点搭建、参数调优与提示词结构化设计,并延伸到剧本拆分、角色一致性控制、后期合成及平台变现路径,为AI漫剧创作者提供一套低成本、可复制的工程化方案。无论

weixin_29051149的博客 161

类的加载器及类加载过程

类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)

小丁的博客 276

[Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下

本文记述了笔者设计并实现以±12V供电电压输出1KHZ~10KHZ频率连续可调的方波、三角波和正弦波的过程。其中,方波输出电压峰峰值为12V(误差<20%),占空比可调、三角波输出电压峰峰值为8V(±20%),正弦波输出电压峰峰值≥1V。

lgc0208的博客 4万+

『ISOBUS 入门』第 00 节 导言:ISOBUS 的宏观图景与入门路径

ISOBUS 是由三部分构成的集成系统:两段CAN网络(拖拉机与农具侧)、标准化通信约定及认证流程。其核心在于通过统一协议实现跨品牌设备即插即用。标准体系以ISO 11783为基础,分层涵盖物理层、传输层至应用层,关键功能如虚拟终端(VT)、任务控制器(TC)和文件服务器依赖严格的会话管理与角色分工。实际部署中,总线上传输多种协议报文,故障排查需结合地址声明、多包传输与角色权限分析。学习应从真实报文入手,建立“角色—数据流—功能块”认知链,避免仅学标准或仿真替代实测,方能有效应对复杂现场问题。

linx295的博客 286

【类加载过程详解】

加载、验证 、准备 、解析、初始化、使用、卸载。

严文文 Chris 858

深入解析V4L2框架与高通KMD在Camera驱动中的协同设计

本文深入解析了V4L2框架与高通KMD在Camera驱动中的协同设计。V4L2作为Linux内核标准视频驱动框架,提供了统一的设备抽象与数据流管理;而高通KMD则在其基础上,通过引入CRM等核心模块,构建了一套针对移动平台复杂相机系统的高效内核态驱动架构,实现了硬件配置与执行的解耦与智能调度。

qq_27496129的博客 1149

Java--使用类加载器加载配置文件

配置文件内容 username=tom password=root 实现代码 /** * 使用类加载器加载配置文件 */ @Test public void test3() throws IOException { Properties properties = new Properties(); //读取配置文件,配置文件默认在项目工程的src目录下 ClassLoader classLoader =

weixin_42614150的博客 849

STM32电机库(ST-MC-Workbench)实战指南——三电阻电流采样电路参数配置详解

本文详细解析了STM32电机库(ST-MC-Workbench)中三电阻电流采样电路的参数配置方法,涵盖电阻选型、放大增益计算、滤波时间优化等关键步骤。通过实战案例和调试技巧,帮助工程师快速掌握电流采样技术,提升电机控制系统的精度与稳定性。特别针对ST-MC-Workbench界面参数设置提供了详细指导。

weixin_29186249的博客 509

uniapp [安卓苹果App端] - 实现APP开发后台保活+息屏后台持续运行效果,强制后台保活手机黑屏后进程存活后台保持网络连接或持续定位等功能提供支持(app后台运行休眠仍然可以确保一直运行)

uniapp APP开发后台保活,Uniapp-APP后台保活插件(安卓苹果ios后台保活)保证应用在后台继续运行,uniapp实现app保活 保后台运行 避免系统主动杀进程,如何让安卓APP一直在后台运行?uniapp 安卓 APP 后台持续运行(保活)iOS App后台保活,Android 后台运行白名单实现保活,保活息屏后台运行,uniapp后台保活,uniapp熄屏 后台运行,Android/ios进程保活/息屏后后台保持定位、网络运行,uniapp在android ios保活,挂后台可运行,安卓A

🏆 前端领域优质创作者 1万+

java类加载模式与web容器的类加载模式

一.概述在初学java的时候,很多书和资料都会说java是一个跨平台的语言,是一个动态语言,可以在运行期间加载类。首先说,java是一个跨平台的语言,是因为它的两个关键点: java虚拟机 jvm .class 字节码文件 任何一个java文件都是先编译成 .class文件,然后再经过jvm解释成机器码。只要拥有.class文件和jvm,那么任何一个平台都可以运行。然后再看,java是一个动态语

Mooneal的博客 2404

二维光子晶体禁带的遗传优化算法实现

二维光子晶体禁带的遗传优化算法MATLAB源代码 光子晶体中因周期性结构而存在的频率禁带称为光子禁带,光子禁带的存在是光子晶体具有广泛应用前景的重要原因。 禁带越大,可控光的频带也越宽,因此如何设计合适的晶体结构以获得大的光子禁带一直是研究和应用的重点与热点。 给大家讲解在平面波展开法的基础上,使用遗传算法寻找具有最大光子禁带的二维光子晶体结构。 %-------------------------------------------------------------------------- % Ph

m0_53407570的博客 583

Java基础之类加载器

Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序。本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式(双亲委派模式),然后介绍了几种常见的类加载器及其适用场景,最后则一个例子展示了如何自定义类加载器。 基本概念 基本文件类型和概念 常见概念介绍: java源文件(.java):.java是Java的源文件后缀,里面存放程序员编写的功能代码,只是一个文本文件,不能被java虚拟机所识别, 但是java语法有

m0_68064743的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java类加载器ClassLoader

1.ClassLoader介绍 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现. 类加载器是一个用来加载类文件的类...

CsbLanca 300

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【JAVA】深入探讨 Java 类加载器2

深入探讨 Java 类加载器2 博客分类: j2SE Java应用服务器OSGI网络应用Web. 开发自己的类加载器 我的天,爱死这作者了!!(转载者泪流满面ing) 虽然在绝大多数情况下,系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下,您还是需要为应用开发出自己的类加载器。比如您的应用通过网络来传输 Java 类的字节代码,为了保证安全性,这些字节代码经过了加密处理。这个...

tudusi 100

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Servlet的自动加载

然后,容器会将这些Servlet类的字节码文件加载到内存中,并调用Java的反射机制创建Servlet类的实例。当容器启动时,它会读取web.xml文件中的配置信息,自动加载指定的Servlet类。容器会将Servlet类的字节码文件加载到内存中,并调用Java的反射机制创建Servlet类的实例。在自动加载过程中,Servlet容器可能会使用不同的类加载器策略,以确保Servlet类与其他类之间的隔离。总之,Servlet的自动加载主要依赖于Java的类加载机制和Servlet容器的配置。

2301_78090811的博客 493

小明学java基础系列——Java 类加载

Java11类加载学习笔记前言类加载器基本概念java.lang.ClassLoader 类介绍类加载器的树状组织结构类加载器的代理模式加载类的过程线程上下文类加载器Class.forName开发自己的类加载器文件系统类加载器网络类加载器类加载器与 Web 容器 前言 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。J

小明的博客 582

简易的web容器的封装

web容器的封装 文章目录web容器的封装本篇文章的目的是封装一个简易的tomcat容器1、在main方法中使用2、封装request3、response和servlet只有简单的方法4、configUtil类和web.config5、开始封装类加载器6、web服务创建一个WebService7、调用主方法 本篇文章的目的是封装一个简易的tomcat容器 ​ tomcat是一个web容器 用来接收...

pyczlb的博客 451

(转载)从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重视。 废话不说,直接进入主题! 代码清单1: [code="java"] 01 import java.io.InputStream; 02 import ja...

zx527291227的专栏 197

从读取properties文件说开去,浅谈web容器中类加载器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34407348的博客 87

资源定位的问题-URLClassLoader、ServletContext、jetty资源加载

一、问题描述 发现代码: 在antx.properties中数值为: finance.abc.ict.port  = 1599   猜测应该是 SysConfig读取配置文件失败。基本定位是资源加载的问题。 二、问题定位 启动容器调试: 发现类加载器是:org.eclipse.jetty.webapp.WebAppClassLoa

专注海量数据 2019

Web服务器获取各种路径的方法

Web服务器获取路径的方法 ServletContext context1 = this.getServletContext(); // 获取文件的服务器路径 // web目录下的资源访问 "/"+文件名 String b_path = context1.getRealPath("/b.txt"); out.println(b_path); // WEB-INF下的资源访问 Str

卜大爷的博客 2万+

JVM中ClassLoader的学习

JVM中class loaderの学习 一、.class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到jvm中意味着什么——类的初始化 在虚拟机规范中,我们规定,有且只有五种情况必须立即对类进行初始化 创建类的实例(new一个对象)访问某个类或者接口的静态变量,对静态变量赋值,调用类的静...

anmoji6472的博客 168

关于Java文件路径问题 转贴

http://www.blogjava.net/ericwang/default.html?page=2 1.如何获得当前文件路径 常用: 字符串类型:System.getProperty("user.dir"); 综合: package com.zcjl.test.base; import java.io.File; public class Test { ...

hgx0615的专栏 160

京东java研发岗二面:Tomcat是如何做到热加载和热部署的?

热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。 通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在Web容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重新加载类,这个过程不会清空Session。而在生产环境我们一般应用的是热部署,热部署也是在Web应用后台线程定期检测,发现有变化就会重新加载整个Web应用,这种方式更加彻底会清空Session。 # 热加载 热加载其实我们在开发过程中经常使用,例如我们使用Idea开发时,我们在设

m0_58008803的博客 136
上一篇: CSS伪类介绍 (上)
下一篇: CSS 优先级
「已注销」
博客等级 码龄16年 3粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值