使用 SLF4J+Logback 的 OSGi 应用程序上的 java.lang.LinkageError

标签 java maven osgi slf4j logback

我在作为 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/

相关文章:

java - 如何更改数组列表中对象的属性?

java - 如何读取包含多个元素的 XML 文件

java - Spring Security 在 Controller 中使用@security 注释

java - 为什么不从父类(super class)继承 OSGi 声明性服务 (DS) 注释?

osgi - 如何为运行时依赖项添加导入包指令?

java - 使用 Eclipse 和 OSGi 将类动态加载到 Java 类路径

java - java中的随机数

java - 创建自己的方法?

java - 带有 Spring Boot 1.5.* 的 Elastic Search 5.4

java - 错误: type org. osgi.util.tracker.ServiceTracker不接受参数