我的应用程序在 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
与专家。
问题是部署时出现以下错误:
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
我检查了我的应用 .war
对于 cglib 并在 WEB-INF/lib
中找到它目录。 AFAIK 位于此目录中的 jars 中的所有类都在类路径中,并且 jars 中的类在 server/<servername>/lib
中。 .为什么 Spring 找不到 cglib?
最佳答案
为了这个问题的目的,JBoss 类加载器层次结构只能看“向下”,即系统类加载器加载的类看不到应用程序的 lib 目录中的类。因此服务器的 lib 目录中的 Spring 库无法在您的应用程序的 lib 目录中看到 cglib。
可能的解决方案,按优先顺序排列:
- 从服务器的 lib 目录中删除 Spring JAR。他们不应该在那里,这只是个坏主意。但是你说你不能这样做。
- 将cglib 添加到服务器的lib 目录。出于与上述相同的原因,不是一个选项。
- 将 Spring JAR 的副本添加到应用程序的 lib 目录中。确保它们与服务器的完全相同,否则您将面临奇怪的类版本控制冲突的风险。这应该允许解析 cglib。
选项 3 远非理想,因为在类加载器之间复制类会导致类加载器问题,但它可能是您唯一的选择。
关于java - Spring Framework 在 JBoss 上看不到 cglib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566955/