Tomcat服务器启动错误之Offending class: javax/servlet/Servlet.class

  引子   

    最近在基于Wex5项目开发中,遇到使用过程中与Tomcat功能有关的错误提示, 如题所示。最终的解决方法就是删除掉项目上与tomcat冲突的jar包。

org.apache.catalina.loader.WebappClassLoader validateJarFile


??validateJarFile(/Users/zxzpc/Downloads/X5/WeX5_V3.4mac/apache-tomcat/webapps/../../runtime/BaasServer/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class



      顺便查找了一些资料,整理如下:

      Tomcat 启动后先将tomcat/common/lib目录下的jar包全部读入内存,如果webapps目录里的应用程序中WEB-INF/lib目录下有相同的包,将无法加载,估计不同版本的包之间也会造成类似问题。因此建议尽量不要把jar包放入tomcat/common/lib目录下,应该放入WEB- INF/lib目录下。


    Tomcat类加载顺序小结

    Tomcat下的文件目录 

  1. /bin:存放启动和关闭tomcat的脚本文件;

  2.  /conf:存放tomcat的各种配置文件,比如:server.xml 

  3. /server/lib:存放tomcat服务器所需要的各种jar文件(jar文件只可被tomcat 服务器访问) 

  4. /server/webapps:存放tomcat自带的两个web应用:admin应用和manager应用。 

  5. /common/lib:存放tomcat服务器以及所有web应用都可以访问的jar文件夹(web和tomcat服务器都可访问此jar)

  6. /shared/lib:存放web都可访问的jar文件。(可以被所有的web访问,但不能被tomcat访问)

  7.  /logs:存放tomcat的日志文件 

  8. /webapps:当发布web应用时,默认情况下把web应用文件放于此目录下 

  9. /work:tomcat把由jsp生成的Servlet放于此目录 

    另:在web应用中,WEB-Inf目录下,也可以建立lib子目录,在此子目录下可以存放各种jar文件,这些jar文件只能被当前web应用访问。其中,在web-inf目录下的lib与classes目录,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。因为类同名时,classes优先。 

    其中jsp运行时,查找class的顺序为:项目文件夹(WEB-INF\lib)—>容器文件夹(tomcat\common\lib)—>jdk文件夹(jdk\jre\lib\ext) 

    默认情况下,Tomcat是一种向上寻找的层次结构,也有向下的,或者是可配置的。 

    Tomcat的class加载优先级 

1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。 
2.环境变量CLASSPATH中的jar和class文件。 
3.$CATALINA_HOME/common/classes下的class文件。 
4.$CATALINA_HOME/commons/endorsed下的jar文件。 
5.$CATALINA_HOME/commons/i18n下的jar文件。 
6.$CATALINA_HOME/common/lib 下的jar文件。(JDBC驱动之类的jar文件可以放在这里,避免配置好数据源却找不到JDBC Driver的情况。) 
7.$CATALINA_HOME/server/classes下的class文件。 
8.$CATALINA_HOME/server/lib/下的jar文件。 
9.$CATALINA_BASE/shared/classes 下的class文件。 
10.$CATALINA_BASE/shared/lib下的jar文件。 
11.各自具体的webapp /WEB-INF/classes下的class文件。 
12.各自具体的webapp /WEB-INF/lib下的jar文件。 

    class的搜寻顺序

/WEB-INF/classes of your web application 


/WEB-INF/lib/*.jar of your web application 


$CATALINA_HOME/common/classes 


$CATALINA_HOME/common/endorsed/*.jar 


$CATALINA_HOME/common/i18n/*.jar 


$CATALINA_HOME/common/lib/*.jar 


$CATALINA_BASE/shared/classes 


$CATALINA_BASE/shared/lib/*.jar 



因此放在不同webapp里的class文件,会被classloader加载成不同的实例。 在不同的webapp加载相同类名的类互不影响。 

但是注意,以下包名开头的class例外: 
javax.* 
org.xml.sax.* 
org.w3c.dom.* 
org.apache.xerces.* 
org.apache.xalan.* 

值得注意的是:在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对,也会提供jar的加载优先顺序。 
例如某jar的MAINFEST.MF内容如下: 
Manifest-Version: 1.0 
Created-By: Zianed 
Class-Path: commons-beanutils.jar 
Class-Path: commons-collections.jar 
Class-Path: commons-dbcp.jar 
Class-Path: commons-digester.jar 
Class-Path: commons-logging.jar 
Class-Path: commons-pool.jar 
Class-Path: commons-services.jar 
Class-Path: commons-validator.jar 
Class-Path: jakarta-oro.jar 
Main-Class: Test 

那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jar,commons-collections.jar等jar文件。 

在不同的地方放置jar和class可能会产生意想不到的后果,尤其是不同版本的jar文件,因此在实际应用部署web应用时候要特别留心. 
例如 使用javamail常见的一个出错信息: javax.mail.NoSuchProviderException: No provider for smtp 

其真实原因就很可能如下: 
在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar 
在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在 
D:\jakarta-tomcat-5.5.8\webapps\mialtest\WEB-INF/lib下, 那么mialtest中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。















本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/1769307 ,如需转载请自行联系原作者




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象进阶(二)----------类的内置方法

一、isinstance(obj,cls)和issubclass(sub,super) 1. isinstance(obj,cls): 检查是否obj是否是类 cls 的对象 class Player:passp Player()print(isinstance(p, Player))>>> Ture 2. issubclass(sub, super): 检查sub类是否是 super 类的派生类 class Player:passcla…

BZOJ.3265.志愿者招募加强版(费用流SPFA)

题目链接 见上题。 每类志愿者可能是若干段&#xff0c;不满足那个...全幺模矩阵(全单位模矩阵)的条件&#xff0c;所以线性规划可能存在非整数解。 于是就可以用费用流水过去顺便拿个rank2 233. //20704kb 300ms #include <queue> #include <cstdio> #include &…

谷歌相册_Google相册中的新存档功能是什么?

谷歌相册If you’re a Google Photos user, you’ve may have seen a new feature called “Archive” show up in the app’s sidebar. if not, don’t stress—it’s just now rolling out and not everyone has it yet. Since it’s new, here’s a quick look at what it i…

CenterOS 7安装Nginx

1.wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm下载对应当前系统版本的nginx包(package) 2.rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm建立nginx的yum仓库 3.yum install nginx 下载并安装nginx systemctl s…

Java的组合排列问题

从4个人中选2个人参加活动&#xff0c;一共有6种选法。 从n个人中选m个人参加活动&#xff0c;一共有多少种选法&#xff1f;C(m/n)C((m-1)/(n-1))C(m/(n-1))数学算法 public class Main {public static void main(String[] args) {System.out.println("请输入总人数:&quo…

阿里云一键建站产品,阿里云自营建站-中小企业建站首选

阿里云推出的自营建站服务&#xff0c;这对于中小企业来说简直是福利了&#xff0c;现在一般的公司都开始有了自己的官网&#xff0c;有可能就是因为你的官网设计的标准&#xff0c;大气&#xff0c;客户就会对你的信任度增加&#xff0c;从而促进一笔不小的订单&#xff0c;这…

航拍拉近拉远镜头_什么是远摄镜头?

航拍拉近拉远镜头Telephoto lenses can be incredibly useful, but how is it different from other lenses, and when should you use it? 远摄镜头可能非常有用&#xff0c;但是它与其他镜头有什么不同&#xff1f;何时使用&#xff1f; 什么是远摄镜头&#xff1f; (What I…

数据库的简单了解

数据库一、什么是数据库存储数据的仓库将数据有组织&#xff0c;按照特定的格式存储在介质上叫做数据库二、比较多个数据库系统a) Oracle 最好的数据库没有之一b) SQL server 最好的数据库(windows)c) MySQL 甲骨文(Oracle) sun 开源三、SQL语言a) SQL(结构化查询语句) …

阿里云对象存储OSS支持版本管理特性

2019独角兽企业重金招聘Python工程师标准>>> 阿里云对象存储OSS现已经全面支持“对象版本管理”特性。该功能适用于所有的存储类型以及区域。当Bucket启用该特性后&#xff0c;“对象版本管理”功能可以保护和恢复误删除、误覆盖的数据。 对象存储OSS“版本管理”具…

Python第一天学习---基础语法

1.字符串的用法(String) Python 中的字符串有两种索引方式&#xff0c;从左往右以 0 开始&#xff0c;从右往左以 -1 开始。Python中的字符串不能改变。Python 没有单独的字符类型&#xff0c;一个字符就是长度为 1 的字符串这三点是我觉得Python字符处理特别的一点 我们来看第…

教你几招识别和防御Web网页木马

本文同时发表在&#xff1a;[url]http://netsecurity.51cto.com/art/200709/56360.htm[/url] 根据反病毒厂商Sophos今年的第一、第二季度报告&#xff0c;网页已经超过电子邮件成为恶意软件传播时最喜欢使用的途径&#xff0c;通过网页传播的恶意软件平均每月增加300多种。而对…

apple tv设置_如何设置Apple TV播放个人iTunes库

apple tv设置If you already have a lot of music and home videos in your iTunes library, you can easily stream it all to your Apple TV, and thus whatever output sources to which it is connected. 如果iTunes库中已经有很多音乐和家庭视频&#xff0c;则可以轻松地将…

[bzoj1050 HAOI2006] 旅行comf (kruskal)

传送门 Description 给你一个无向图&#xff0c;N(N<500)个顶点, M(M<5000)条边&#xff0c;每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T&#xff0c;求 一条路径&#xff0c;使得路径上最大边和最小边的比值最小。如果S和T之间没有路径&#xff0c;输出”IMPOSS…

好程序员技术文档HTML5开发中的javascript闭包

好程序员技术文档HTML5开发中的javascript闭包&#xff0c;事实上&#xff0c;通过使用闭包&#xff0c;我们可以做很多事情。比如模拟面向对象的代码风格;更优雅&#xff0c;更简洁的表达出代码;在某些方面提升代码的执行效率&#xff0c;同时避免对命名空间的污染&#xff0c…

亚马逊echo中国使用_如何使用亚马逊的主要照片备份所有照片

亚马逊echo中国使用Millions of people are Amazon Prime subscribers, but many of them don’t realize that in addition to free shipping and Prime Instant Video, they also get unlimited photo storage for all their computers and mobile devices. 数以百万计的人是…

抽象SQL查询:SQL-MAP技术的使用

什么是参数化查询&#xff1f;我们来看百度百科对此的定义和示例&#xff1a; 一&#xff0c;定义 ------------------------------------------------------------------ 参数化查询&#xff08;Parameterized Query 或 Parameterized Statement&#xff09;是指在设计与数据库…

EF ORM

//新增UserInfo userInfo new UserInfo();userInfo.UserName "YANG";userInfo.UserPass "123";userInfo.Email "253qq.com";userInfo.RegTime System.DateTime.Now;Model1Container db new Model1Container();db.UserInfoSet.Add(userInfo…

如何使用echo.js实现图片的懒加载(整理)

如何使用echo.js实现图片的懒加载&#xff08;整理&#xff09; 一、总结 一句话总结&#xff1a;a、在img标签中添加data-echo属性加载真实图片&#xff1a;<img class"loading" src"blank.gif" data-echo"图片真实路径" />&#xff0c;在…

还原出厂设置 擦除frp_如何备份,擦除和还原Apple Watch

还原出厂设置 擦除frpThe Apple Watch is, in its own right, a little tiny computer with data backup and security needs. Read on as we show you how to ensure your Apple Watch is backed up, wiped, and restored just like you’d do with your smartphone. Apple Wa…

exchange 2010 search mailbox 的幕后强大功能

铃……….半夜中被一阵急促的手机铃声吵醒&#xff0c;年度服务客户打来电话需要进行邮件的排查和删除工作。问其原因&#xff0c;原来是组织中有人发了一封关于领导的不健康的邮件&#xff0c;并在企业内部进行了转发&#xff0c;领导要求立即找出此类邮件并进行删除。管理员深…