[英]Detect the path of a resource loaded by classloader
我們有一個 java 應用程序,它正在從類路徑加載 logback.xml 文件。 我們如何從加載該文件的位置得知 jar/目錄的確切位置?
我在 main() 中嘗試了這個代碼片段:
URL[] urLs = ((URLClassLoader) (Thread.currentThread().getContextClassLoader())).getURLs();
for (URL url: urLs) {
System.out.println("classloader url="+url);
}
它打印由類加載器加載的所有 jars:
classloader url=jar:file:/my-service.jar!/BOOT-INF/classes!/
classloader url=jar:file:/my-service.jar!/BOOT-INF/lib/spring-boot-2.5.2.jar!/
classloader url=jar:file:/my-service.jar!/BOOT-INF/lib/spring-boot-actuator-2.5.2.jar!/
classloader url=jar:file:/my-service.jar!/BOOT-INF/lib/spring-cloud-starter-bootstrap-3.0.3.jar!/
classloader url=jar:file:/my-service.jar!/BOOT-INF/lib/spring-cloud-starter-3.0.3.jar!/
classloader url=jar:file:/my-service.jar!/BOOT-INF/lib/spring-cloud-context-3.0.3.jar!/
謝謝你。
我們如何從加載該文件的位置得知 jar/目錄的確切位置?
它在 URL 中。
jar:file:/my-service.jar!/BOOT-INF/classes!/
指URL“file:/my-service.jar”給出的JAR文件中的目錄“/BOOT-INF/classes”中的目錄“/”
jar:file:/my-service.jar!/BOOT-INF/lib/spring-boot-2.5.2.jar!/
指JAR文件中JAR文件“/BOOT-INF/lib/spring-boot-2.5.2.jar”中的目錄“/”由ZE6B391A8D2C4D45902A23A8B給出的“文件:/myservice-55902A23A8B”
等等。
這里實際發生的是 Spring 引導類加載器了解如何在 JARs 中找到嵌套在其他 JARs 中的東西。
如果要查找特定資源將從哪里加載,可以調用classLoader.getResource(resourcePath)
獲取 URL,然后如上解釋 URL。
如果我正確讀取https://logback.qos.ch/manual/configuration.html ,默認資源路徑將是“/logback-test.xml”,后跟“/logback.xml”。 但這可以通過各種方式覆蓋。
您還應該能夠通過設置系統屬性來跟蹤 Logback 從何處獲取其配置; 請參閱如何確定 Logback 實際使用的日志配置源?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.