1

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

问题是部署时出现以下错误:

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

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

4

1 回答 1

3

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

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

  1. 从服务器的 lib 目录中删除 Spring JAR。他们不应该在那里,这只是一个坏主意。但是你说你不能这样做。
  2. 将 cglib 添加到服务器的 lib 目录。由于与上述相同的原因,这不是一个选项。
  3. 将 Spring JAR 的副本添加到应用程序的 lib 目录。确保它们与服务器的完全相同,否则您将面临奇怪的类版本冲突的风险。这应该允许解析 cglib。

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

于 2012-05-12T20:05:28.903 回答