![](/img/trans.png)
[英]SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”, API
[英]How slf4j replace org.slf4j.impl.StaticLoggerBinder placed in sfl4j-api to real StaticLoggerBinder
在slf4j api中存在類org.slf4j.impl.StaticLoggerBinder,org.slf4j.impl.StaticMarkerBinder,org.slf4j.impl.StaticMDCBinder。 但是每個綁定到具體記錄器的應該包含相同的類。
例如:
及其log4j實現: http ://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-log4j12/1.6.1/org/slf4j/impl/StaticLoggerBinder.java?av = f
java類加載器如何替代它? 這不應該是一個例外嗎?
如果您提取實際的slf4j-api jar,您會注意到org.slf4j.impl.StaticLoggerBinder
實際上並未包含在jar中。 SFL4J api是在構建時針對類編譯的,但它實際上並未包含在工件中。 如果查看api模塊中org.slf4j.impl.StaticLoggerBinder
的源代碼,它沒有實現,所有公共實例方法都會拋出UnsupportedOperationException
。 這沒關系,因為該類被排除在slf4j-api jar之外。
類加載器正常運行並選擇在需要加載類時找到的org.slf4j.impl.StaticLoggerBinder
的第一個版本。 這通常來自它在類路徑中列出的第一個slf4j實現jar。
注意: findPossibleStaticLoggerBinderPathSet()
僅用於警告類路徑上存在多個綁定。 它實際上並不加載任何綁定。
嗯,好問題,因為slf4j
假設不使用運行時加載類。 它看起來在啟動時使用classloader檢查以下方法:
private static Set findPossibleStaticLoggerBinderPathSet() {
// use Set instead of list in order to deal with bug #138
// LinkedHashSet appropriate here because it preserves insertion order during iteration
Set staticLoggerBinderPathSet = new LinkedHashSet();
try {
ClassLoader loggerFactoryClassLoader = LoggerFactory.class
.getClassLoader();
Enumeration paths;
if (loggerFactoryClassLoader == null) {
paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
} else {
paths = loggerFactoryClassLoader
.getResources(STATIC_LOGGER_BINDER_PATH);
}
while (paths.hasMoreElements()) {
URL path = (URL) paths.nextElement();
staticLoggerBinderPathSet.add(path);
}
} catch (IOException ioe) {
Util.report("Error getting resources from path", ioe);
}
return staticLoggerBinderPathSet;
}
@Dev是對的 - org.slf4j.impl.StaticLoggerBinder
僅包含在slf4j-api源中而不包含在二進制文件中 - 由於編譯原因,僅包含在源代碼中是一個簡單的技巧。 可以理解的是, findPossibleStaticLoggerBinderPathSet
僅用於記錄目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.