繁体   English   中英

ClassLoader.getResources 在 Weblogic/Spring 应用程序上返回一个空的枚举

[英]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 文档中的注释有关:

https://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html

警告:请注意,“classpath*:”与 Ant 样式模式结合使用时,将仅在模式启动之前至少在一个根目录下可靠地工作,除非实际目标文件驻留在文件系统中。 这意味着像“classpath*:*.xml”这样的模式不会从 jar 文件的根目录检索文件,而只会从扩展目录的根目录检索文件。 这源于 JDK 的 ClassLoader.getResources() 方法中的限制,该方法仅返回传入的空字符串的文件系统位置(指示要搜索的潜在根)。

这似乎是说该问题仅适用于从 jar 文件加载 spring 上下文文件。 但是我对 Weblogic Server 12.2 的经验表明,在文件系统上使用扩展目录时,它也可能存在同样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM