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

时间:2016-04-20 17:41:01

标签: java spring classloader weblogic12c

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

Spring找不到基础包,因为Weblogic的类加载器为Spring's code返回一个空的枚举:cl.getResources("my/base/pkg")

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

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

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

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

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

它可能是什么?

1 个答案:

答案 0 :(得分:1)

使用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的拦截器中使用了以下内容:

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 *:”   只能在至少一个根目录之前可靠地工作   模式开始,除非实际目标文件驻留在文件中   系统。这意味着像“classpath *:*。xml”这样的模式不会   从jar文件的根目录中检索文件,而不仅仅是从   扩展目录的根目录。这源于对的限制   JDK的ClassLoader.getResources()方法只返回文件系统   传入的空字符串的位置(表示潜在的根目录)   搜索)。

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