Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SLF4J+;的OSGi应用程序上的java.lang.LinkageError;倒退_Java_Maven_Osgi_Slf4j_Logback - Fatal编程技术网

使用SLF4J+;的OSGi应用程序上的java.lang.LinkageError;倒退

使用SLF4J+;的OSGi应用程序上的java.lang.LinkageError;倒退,java,maven,osgi,slf4j,logback,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/bu

我已经在一个作为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
14:21:09.846[FelixStartLevel]错误o.p.o.framework.FrameworkSlf4jLogger-错误启动文件:/myapp/target/distribution/bundles/myapp.jar
org.osgi.framework.BundleException:bundle myapp中的Activator启动错误[10]。
在org.apache.felix.framework.felix.activateBundle(felix.java:2204)~[org.apache.felix.main-4.4.1.jar:na]
在org.apache.felix.framework.felix.startBundle(felix.java:2072)~[org.apache.felix.main-4.4.1.jar:na]
在org.apache.felix.framework.felix.setActiveStartLevel(felix.java:1299)~[org.apache.felix.main-4.4.1.jar:na]
在org.apache.felix.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:304)[org.apache.felix.main-4.4.1.jar:na]
在java.lang.Thread.run(Thread.java:745)[na:1.8.0_25]
原因:java.lang.LinkageError:loader约束冲突:在解析方法“org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILOGERFactory”时;当前类的类加载器(org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5的实例)以及类加载器(org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5的实例)对于方法的定义类org/slf4j/impl/StaticLoggerBinder,对于签名中使用的类型org/slf4j/ILoggerFactory,具有不同的类对象
在org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:336)~[slf4j-api-1.7.12.jar:1.7.12]
在org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)~[slf4j-api-1.7.12.jar:1.7.12]
在org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:305)~[slf4j-api-1.7.12.jar:1.7.12]
在org.koolapi.ServiceLoaderModule.(ServiceLoaderModule.java:35)~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
在org.koolapi.apibinding.Manager.createInjector(Manager.java:99)~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
在org.koolapi.apibinding.Manager.instatiateDocumentManager(Manager.java:197)~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
在org.koolapi.apibinding.Manager.createDocumentManager(Manager.java:38)~[koolapi-3.7.4.jar:3.7.4.20150518-0134]
在org.myapp.app.Activator.loadConfiguration(Activator.java:21)~[classes/:na]
在org.myapp.app.Activator.start(Activator.java:45)~[classes/:na]
在org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)~[org.apache.felix.main-4.4.1.jar:na]
在org.apache.felix.framework.felix.activateBundle(felix.java:2154)~[org.apache.felix.main-4.4.1.jar:na]
…省略了4个公共帧
关于依赖关系:myapp依赖于父应用程序,父应用程序依赖于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,但没有Export包指令在其清单中

总的来说,我检查了所有捆绑包(felix、guava、logback core、logback classic、slf4j api、koolapi、parent app)的清单,以查看谁在使用/导出slf4j,只有logback-classic.jar显式导出org.slf4j.impl;version=1.7.7

有人对如何解决冲突有什么想法或建议吗

任何帮助都将不胜感激!非常感谢,
Joel

该错误意味着您创建了这样一种情况:一个类加载器可以看到来自多个定义类加载器的类型
ILoggerFactory
。这在Java中是不合法的,因此出现了
LinkageError

如果没有完整的捆绑包内容和清单,很难确定诊断,但原因可能是
slf4j api
koolapi
捆绑包中的副本。像这样嵌入库是可以的,除非类型通过导出类型上的方法签名泄漏。由于这种泄漏,您的应用程序捆绑包暴露在
iLogger工厂
类型的多个副本


修复应该相对简单:从
koolapi
内部删除
slf4j api.jar
,并使
koolapi
作为正常依赖项导入包。

该错误意味着您创建了这样一种情况:一个类加载器可以看到来自多个定义类的类型
ILoggerFactory
这在Java中是不合法的,因此出现
LinkageError

如果没有完整的捆绑包内容和清单,很难确定诊断,但原因可能是
slf4j api
koolapi
捆绑包中的副本。像这样嵌入库是可以的,除非类型通过导出类型上的方法签名泄漏。由于这种泄漏,您的应用程序捆绑包暴露在
iLogger工厂
类型的多个副本

修复应该相对简单:从
koolapi
内部删除
slf4j api.jar
,并使
koolapi
作为正常依赖项导入包