簡體   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