我在作为 OSGi 包的 Java (1.8) 应用程序上用 SLF4J+Logback 替换了 JUL 日志记录。但是,更换后,我可以再让它运行(参见下面的错误)。我正在使用 Maven Bundle 插件 (BND),但我不是 OSGi 方面的专家。
14:21:09.846 [FelixStartLevel] ERROR o.p.o.framework.FrameworkSlf4jLogger - Error starting file:/myapp/target/distribution/bundles/myapp.jar
org.osgi.framework.BundleException: Activator start error in bundle myapp [10].
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2204) ~[org.apache.felix.main-4.4.1.jar:na]
at org.apache.felix.framework.Felix.startBundle(Felix.java:2072) ~[org.apache.felix.main-4.4.1.jar:na]
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1299) ~[org.apache.felix.main-4.4.1.jar:na]
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:304) [org.apache.felix.main-4.4.1.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:336) ~[slf4j-api-1.7.12.jar:1.7.12]
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284) ~[slf4j-api-1.7.12.jar:1.7.12]
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:305) ~[slf4j-api-1.7.12.jar:1.7.12]
at org.koolapi.ServiceLoaderModule.<clinit>(ServiceLoaderModule.java:35) ~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
at org.koolapi.apibinding.Manager.createInjector(Manager.java:99) ~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
at org.koolapi.apibinding.Manager.instatiateDocumentManager(Manager.java:197) ~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
at org.koolapi.apibinding.Manager.createDocumentManager(Manager.java:38) ~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
at org.myapp.app.Activator.loadConfiguration(Activator.java:21) ~[classes/:na]
at org.myapp.app.Activator.start(Activator.java:45) ~[classes/:na]
at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645) ~[org.apache.felix.main-4.4.1.jar:na]
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154) ~[org.apache.felix.main-4.4.1.jar:na]
... 4 common frames omitted
关于依赖:myapp依赖parent-app,parent-app依赖slf4j-api v1.7.12、guava v18、logback-core和logback-classic v1.1.3。所以我没有在 myapp 的 pom.xml 中显式设置这些依赖项。 myapp 还有另一个关键依赖项,即 koolapi;此 OSGi 包在其/lib/文件夹中包含 slf4j-api-1.7.10.jar,但其 list 中没有 Export-Package 指令。
总的来说,我检查了所有 bundle (felix、guava、logback-core、logback-classic、slf4j-api、koolapi、parent-app)的 list ,以查看谁在使用/导出 slf4j,并且仅检查了 logback-classic.jar显式导出 org.slf4j.impl;version=1.7.7。
有人对如何解决冲突有任何想法或建议吗?
任何帮助将不胜感激!非常感谢, 乔尔
最佳答案
该错误意味着您创建了一种情况,其中一个类加载器具有 ILoggerFactory
类型的可见性。来自多个定义的类加载器。这在 Java 中是不合法的,因此 LinkageError
.
如果没有完整的 bundle 内容和 list ,很难确定诊断,但原因可能是 slf4j-api
的副本里面koolapi
捆。像这样的嵌入库没问题,除非类型通过导出类型上的方法签名泄漏。由于这种泄漏,您的应用程序包会暴露于 ILoggerFactory
的多个副本。类型。
修复应该相对简单:删除 slf4j-api.jar
从里面koolapi
并制作koolapi
将包作为普通依赖项导入。
关于使用 SLF4J+Logback 的 OSGi 应用程序上的 java.lang.LinkageError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35142746/