[英]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.