Jakarta ee Tomcat 5.5和Tomcat 6.0中的ClassNotFoundException错误

Jakarta ee Tomcat 5.5和Tomcat 6.0中的ClassNotFoundException错误,jakarta-ee,tomcat,tomcat6,tomcat7,tomcat5.5,Jakarta Ee,Tomcat,Tomcat6,Tomcat7,Tomcat5.5,我对Tomcat5.5和Tomcat6.0服务器有一个奇怪的问题。我有两个web应用程序将安装在tomcat上。启动tomcat时,这两个web应用程序也会同时启动,但有时一个web应用程序由于一个应用程序中的初始化失败而无法初始化,而另一个应用程序在运行时会出现classnotfoundexception错误。在tomcat 7.0中,即使另一个应用程序未能初始化,应用程序也可以正常运行 经过一些调试,我知道两个应用程序的web inf/lib文件夹中都有一个名为crystal.jar的jar

我对Tomcat5.5和Tomcat6.0服务器有一个奇怪的问题。我有两个web应用程序将安装在tomcat上。启动tomcat时,这两个web应用程序也会同时启动,但有时一个web应用程序由于一个应用程序中的初始化失败而无法初始化,而另一个应用程序在运行时会出现classnotfoundexception错误。在tomcat 7.0中,即使另一个应用程序未能初始化,应用程序也可以正常运行

经过一些调试,我知道两个应用程序的web inf/lib文件夹中都有一个名为crystal.jar的jar。我已经将jar移动到tomcat的common/lib文件夹中,然后它开始正常工作。我想知道为什么它在Tomcat7.0中运行良好,而不是在Tomcat5.x和Tomcat6.x版本中。这些版本之间的类加载架构是否有任何变化

谢谢


EDIT1:库位于两个应用程序WEB-INF\lib目录中,它们与外部DLL没有依赖关系。刚才我阅读了Tomcat5.5类加载器体系结构,并了解到每个web应用程序都有自己的类加载器。WEB-INF\lib文件夹和classes文件夹中的库将加载到此类加载器中。存储在公共目录下的库将放在共享类加载器中。然后,这个库应该在web应用程序的单独类加载器中单独加载。因此,即使一个web应用程序无法启动,其他web应用程序也应该独立工作。这就是为什么我感到奇怪,需要进一步调查。

终于找到了这个问题的答案

当库类 由系统类引用,因此其寿命超过其使用年限。一个 例如,当Java发现JDBC驱动程序或其他服务时 并“自动注册”它。它在一个文档中保持对它的引用 但类本身属于web应用程序,必须 在应用程序停止时卸载,但无法卸载,因为 参考资料。并非所有这些参考文献都很容易澄清

这种情况下的一个典型症状是第一个web应用程序 依靠此系统功能将成功,但第二个和第三个 其他服务将失败(因为在 系统属于第一个web应用程序,无法从中查看类 第二个应用程序的类加载器,反之亦然)

Tomcat 7和Tomcat 6的最新版本具有更好的保护 针对某些已知的PermGen默认内存泄漏 配置

Tomcat 5.5根本没有这种保护

编辑一些参考资料