我正在閱讀有關(guān) classpath* 的 spring 文檔,我發(fā)現(xiàn):請注意,classpath*: 與 Ant 樣式模式結(jié)合使用時,只能在模式開始前至少在一個根目錄下可靠地工作,除非實際的目標文件駐留在文件系統(tǒng)中。這意味著像 classpath*:*.xml 這樣的模式不會從 jar 文件的根目錄中檢索文件,而只會從擴展目錄的根目錄中檢索文件。這源于 JDK 的 ClassLoader.getResources() 方法的限制,該方法僅返回傳入空字符串的文件系統(tǒng)位置(指示要搜索的潛在根)。當我在本地嘗試這個時,我很困惑它適用于 jar 的根目錄,例如:test.txt 資源存在于 test2 根目錄(這是我從中運行應(yīng)用程序的類),并且 test.txt 上還有 test.txt 依賴于 test2項目測試2: @RunWith(JUnit4.class)public class TestDriver {@Testpublic void test() throws IOException { PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); System.out.println(Arrays.toString(resolver.getResources("classpath*:*test.txt"))); Enumeration<URL> enumeration= this.getClass().getClassLoader().getResources(""); int count=0; while(enumeration.hasMoreElements()){ URL url= enumeration.nextElement(); System.out.println(url.getFile()); count++; } System.out.println(count);}}輸出 :[URL [jar:file:/C:/.../.m2/repository/com/test/1.0-SNAPSHOT/test-1.0-SNAPSHOT.jar!/test.txt]] --->這個問題在 jar 的根目錄中檢測到文本文件,根據(jù)文檔,它不應(yīng)該被檢測到從 "this.getClass().getClassLoader().getResources("")" 只有 2 個根(測試 jar 不是其中的一部分):/..../test2/target/test-classes//..../test2/target/classes/2
1 回答

慕斯王
TA貢獻1864條經(jīng)驗 獲得超2個贊
該文檔指的是在這種特定情況下資源查找的可靠性。
您還可以閱讀PathMatchingResourcePatternResolver
javadoc的此警告部分的末尾(重點是我的):
警告:請注意,當與 Ant 樣式模式結(jié)合使用時,“classpath*:”只能在模式開始前至少在一個根目錄下可靠地工作
...
此
ResourcePatternResolver
實現(xiàn)試圖通過 URLClassLoader 內(nèi)省和“java.class.path”清單評估來減輕 jar 根查找限制;但是,沒有可移植性保證。
看來它適用于您的情況。
添加回答
舉報
0/150
提交
取消