[英]ClassLoader.getResources returning an empty Enumeration on a Weblogic/Spring application
我有一个使用 Spring 4.0.4 部署在 Weblogic 12.2 上的 EAR 应用程序,并面临一个奇怪的行为:
由于 Weblogic 的类加载器返回Spring 代码的空枚举, Spring找不到基础包: cl.getResources("my/base/pkg")
它在我的 MDB 上注入了一些 @Autowired bean 的上下文中。 (因此,因此,不会注入豆类)
但是如果我将下面的代码放入同一个应用程序的示例 MDB 中,它会起作用:
Thread.currentThread().getContextClassLoader().getResources("my/base/pkg");
并且似乎 Spring 使用相同的代码来创建其cl
变量。
我注意到的另一件事是:如果我将 Spring 配置为将基本包作为一个具体的包(带有类),它就可以工作。
会是什么呢?
在使用 Spring 2.5.6 将在 Weblogic 12.1 中的 java 7 上运行的应用程序升级到使用 Spring 4.1.9 的 Weblogic 12.2 中的 java 8 时,我遇到了类似的问题(以获得完整的 java 8 支持)。 从技术上讲,Spring 4.1.9 包含与 2.5.6 相同的所有类(尽管已弃用)。
突然间,Spring 不会通过 CLASSPATH 上给出的文件系统上的外部目录中的上下文文件加载 bean。 我们在扩展SpringBeanAutowiringInterceptor
的拦截器中使用了以下SpringBeanAutowiringInterceptor
:
private static final String[] CONTEXT_FILES = {"classpath*:context*.xml"};
这停止工作。 为了让它再次工作,我必须明确传入父文件夹名称(我们称之为“spring_context”)并将我们的 CLASSPATH 修改为一个文件夹。 像这样:
private static final String[] CONTEXT_FILES = {"classpath*:spring_context/context*.xml"}
有关该更改的某些内容允许 spring 通过 WLS 12.2 中的 ClassLoader 获取外部上下文文件列表。 我认为这与 Spring 文档中的注释有关:
警告:请注意,“classpath*:”与 Ant 样式模式结合使用时,将仅在模式启动之前至少在一个根目录下可靠地工作,除非实际目标文件驻留在文件系统中。 这意味着像“classpath*:*.xml”这样的模式不会从 jar 文件的根目录检索文件,而只会从扩展目录的根目录检索文件。 这源于 JDK 的 ClassLoader.getResources() 方法中的限制,该方法仅返回传入的空字符串的文件系统位置(指示要搜索的潜在根)。
这似乎是说该问题仅适用于从 jar 文件加载 spring 上下文文件。 但是我对 Weblogic Server 12.2 的经验表明,在文件系统上使用扩展目录时,它也可能存在同样的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.