您可以在此處找到有關(guān)自動(dòng)模塊的以下信息:模塊系統(tǒng)也掃描 META-INF/services 并使自動(dòng)模塊提供其中命名的服務(wù)。假定允許自動(dòng)模塊使用所有服務(wù)。但是,我有以下情況。我想在 JPMS 中將 log4j2 與 slf4j 一起使用。為了做到這一點(diǎn),它log4j-slf4j-impl-2.11.1.jar必須提供 JPMS 服務(wù)到slf4j-api-1.8.0-beta2.jar. log4j 的開發(fā)者制作log4j-slf4j-impl-2.11.1.jar為自動(dòng)模塊并通過 META-INF/services 提供服務(wù)。但是,它不起作用,它給出了以下內(nèi)容:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger at org.apache.logging.log4j.slf4j@2.11.1/org.apache.logging.slf4j.SLF4JServiceProvider.initialize(SLF4JServiceProvider.java:53) at org.slf4j/org.slf4j.LoggerFactory.bind(LoggerFactory.java:153) at org.slf4j/org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:141) at org.slf4j/org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:419) at org.slf4j/org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:405) at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:354) at org.slf4j/org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:380) at Log4j2Slf4jJdk11/com.temp.NewMain.<clinit>(NewMain.java:12)Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 8 more我決定將模塊信息添加到log4j-slf4j-impl-2.11.1.jarJPMS 并通過provides ... with... 問題解決了 - 我沒有得到任何NoClassDefFoundError. 這是該問題的鏈接。所以我的問題:JPMS 是否支持 META-INF 中的服務(wù)/自動(dòng)模塊的服務(wù)?如果是,那么如何解釋這種行為?
1 回答

慕田峪7331174
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
SLF4J 1.8 需要實(shí)現(xiàn) org.slf4j.spi.SLF4JServiceProvider 作為公開服務(wù)。它在 log4j-slf4j18-impl jar 中發(fā)現(xiàn)。但是,Log4j SLF4J 橋接器需要 Log4J API(模塊 org.apache.logging.log4j)。即使這是一個(gè)顯式的 Java 模塊,因?yàn)樗皇菑淖詣?dòng)模塊中引用,所以它不會(huì)被加載,從而導(dǎo)致 ClassNotFoundException。
對(duì)此的簡(jiǎn)單解決方案是在啟動(dòng)應(yīng)用程序時(shí)在命令行中包含 --addmodules=org.apache.logging.log4j。
添加回答
舉報(bào)
0/150
提交
取消