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

我使用Spring 4.0.4在Weblogic 12.2上部署了一个EAR应用程序并面临一个奇怪的行为:

Spring无法找到基础包,因为Weblogic的类加载器为Spring的代码返回一个空的Enumeration: cl.getResources("my/base/pkg")

它是在我的MDB上注入一些@Autowired bean的上下文中。 (所以,由于它,没有注入豆类)

但如果我将以下代码放入同一个应用程序的示例MDB中,它的工作原理如下:

 Thread.currentThread().getContextClassLoader().getResources("my/base/pkg"); 

并且似乎Spring使用相同的代码来创建其cl变量。

我注意到的另一件事是:如果我将Spring配置为具有基本包(具有类的基础包),它就可以工作。

会是什么呢?

使用Spring 4.1.6将使用Spring 2.5.6在Java 7上运行的应用程序升级到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

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

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