我的应用程序在JBoss 5.1.0.GA上使用Spring Framework 3.0.5。框架由服务器提供,也就是说,框架库位于server/<servername>/lib目录中。该服务器由第三方管理,因此我无法向该服务器提供的环境添加任何库。在我的应用程序中必须使用cglib。 Spring将其用于代理目的。 cglib不在server/<servername>/lib中,因此我已经将cglib-2.2.2.jar包含在我的应用程序.war中。

问题是在部署时发生以下错误:


  由于CGLIB2不可用,因此无法代理目标类。添加CGLIB
  到类路径或指定代理接口。


我已经检查了我的应用程序.war中的cglib,并在WEB-INF/lib目录中找到了它。 AFAIK此目录中jar中的所有类以及server/<servername>/lib中jar中的类都在类路径中。为什么Spring找不到cglib?

最佳答案

出于这个问题的目的,JBoss类加载器层次结构只能“向下看”,即系统类加载器加载的类无法看到应用程序的lib目录中的类。因此,服务器lib目录中的Spring库无法在应用程序li​​b目录中看到cglib。

可能的解决方案,按优先顺序排列:


从服务器的lib目录中删除Spring JAR。他们不应该在那里,那只是一个坏主意。但是你说你做不到。
将cglib添加到服务器的lib目录中。由于上述原因,无法选择。
将Spring JAR的副本添加到应用程序的lib目录中。确保它们与服务器完全相同,否则您将冒奇怪的类版本冲突的风险。这应该可以解决cglib。


选项3并非理想之选,因为在类加载器之间复制类是解决类加载器问题的秘诀,但它可能是您唯一的选择。

关于java - Spring Framework在JBoss上看不到cglib,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10566955/

10-10 16:01