2011-09-07 44 views
1

我根据类加载器的文件运行Tomcat 6.0.23,和(http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html)的webapps应该寻找类顺序为:Tomcat的类加载似乎并不表现为记录

  1. 引导
  2. 系统
  3. WEB-INF/classes中
  4. WEB-INF/lib目录
  5. 常见

我有一个使用hibernate的web应用程序,而hibernate jars在它的WEB-INF/lib目录中。当它自己运行时,一切正常。

我也有一个jar文件需要坐在tomcat/lib目录中,因为它包含一些需要在启动时加载的类(一个对象工厂和它创建的对象)。这些类使用toplink来实现他们的JPA,这里是我遇到问题的地方。

我需要把toplink jars放在tomcat启动时可以访问的地方,所以我把它们放在tomcat/lib目录下。根据上面列出的类加载的顺序,当使用hibernate的webapp需要hibernate实现类时,它应该在它的WEB-INF/lib目录中找到它们,但实际发生的是它从tomcat/lib中找到了toplink实现类目录,并且我得到一个类转换异常。

任何人都可以请解释为什么我的Web应用程序类没有找到他们需要在他们的WEB-INF/lib目录,或建议一种方法来在运行时调试类路径?

谢谢。

+0

很肯定存在着阶级在Tomcat的/ lib目录覆盖由Hibernate需要以及一些类。所以你最终可能会得到同一类的不同字节码版本,从而导致Hibernate失败。检查重复类名和/或重新设计... – home

回答

2

请务必阅读和理解的段落,你引用了前面列表中:

“当一个请求加载从Web应用程序的WebappX类加载器类进行处理,这个类加载器会在本地资源库第一,而不是在查找之前进行委托,也有例外,作为JRE基类的一部分的类不能被重写,对于某些类(例如J2SE 1.4+中的XML解析器组件),可以使用J2SE 1.4认可的功能。

什么是您遇到问题的“hibernate实现类”? (Hibernate的“实现”类将与Toplink完全不同。)它们是否是javax.persistence类?这些可能(或可能不)属于“JRE基类”,它们的行为有所不同。

编辑:根据您的评论,这只是一个典型的跨类加载器加载问题。 Tomcat的类加载正如您所期望的那样工作。如果你看看JPA类,其中这个初始化是怎么回事,你会发现这样一行:

Enumeration<URL> resources = 
    cl.getResources("META-INF/services/" + PersistenceProvider.class.getName()); 

加载所有的ClassLoader所有 PersistenceProviders,包括你的Toplink一个lib目录。然后立即执行此操作:

for (PersistenceProvider provider : providers) { ... 

这就是javax.persistence.Persistence的第77行,您的异常来自其中。这是因为提到了该行的PersistenceProvider类类是从你的web应用的类加载器,但集合包含两个实例:从同一个类加载器,并从不同的类加载器TopLink的一个你的Hibernate实现。

这个全球性的,静态初始化是多数民众赞成让我从转移到JPA一个重大的事情。因为这样的问题,我仍然只是使用直接的Hibernate。

+0

确切的例外,我得到的是如下。 javax.persistence类是否属于上面列出的例外类别?我们在tomcat 5.5的common/lib路径中设置了toplink安装(没有任何使用hibernate的情况),没有问题。 java.lang.ClassCastException:oracle.toplink.essentials.PersistenceProvider不能转换到javax.persistence.spi.PersistenceProvider \t在javax.persistence.Persistence $ 1.isLoaded(Persistence.java:77) \t在org.hibernate.validator .engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:33) – ssloan

+0

@ssloan:更新我的答案。 –

+0

感谢您的解释!现在发生的事情很有意义。 – ssloan

相关问题