对Tomcat中的ClassLoader问题感到困惑

时间:2014-04-17 13:37:11

标签: tomcat classloader

我对Tomcat 7类加载器及其文档感到有些困惑。

这是我的设置:

  1. 使用JRE7 for Tomcat
  2. 有一个common.loader设置,指向应加载的几个lib目录
  3. 有几个webapps,一个进行XML解析
  4. 执行XML解析的webapp在" clean"上运行正常。没有common.loader库的Tomcat。 common.loader库之一是xercesimpl2.jar。如果存在此JAR,则webapp不再正常工作(它在Xerces中找到GregorianCalendan的实现,并且优先于JRE java.xml.datatype类) - 只有在首先找到JRE类时,webapp才有效。

    现在根据Tomcat文档,类查找prio将首先是#st;引导程序,而不是webapp / classes,webapp / lib,然后是common.loader) 为什么webapp不能正常工作,如果它首先使用JRE类(我猜是由引导加载程序加载)?

    如果我将xercesimpl.jar移动到webapp的lib文件夹,XML解析webapp也可以工作,但是我需要通过公共加载器加载xercesimpl.jar。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先,如果可能的话,我会建议你避免将一堆库扔进公共加载器。它有可能导致很多问题(库版本问题,类转换问题等等),并且通常不会给你带来太多好处(可能会节省少量内存)。

通常,您在共享类加载器中放置的唯一内容(如公共加载器)是JDBC或MQ等驱动程序。相反,这些通常在普通装载机中效果最好。

其次,有一类特殊的库需要使用JVM的认可标准覆盖机制加载。你所指的是其中一个库。 Tomcat在这里有一些相关信息。

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html#XML_Parsers_and_Java

使用支持的加载机制应该有助于解决XML解析器问题。