2016-02-02 26 views
0

我已經使用SLF4J + Logback替換了OSGi包的Java(1.8)應用程序中的JUL日誌記錄。但是,更換後,我可以再運行它(請參閱下面的錯誤)。我使用Maven Bundle插件(BND),但我不是OSGi的專家。在使用SLF4J的OSGi應用程序上的java.lang.LinkageError + Logback

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取決於家長的應用程序,它依賴於SLF4J-API v1.7.12,番石榴V18,的logback-core和的logback經典V1.1.3。所以我沒有明確地在myapp的pom.xml中設置這些依賴關係。 myapp有另一個關鍵依賴項,它是koolapi;這個OSGi包在其/ lib /文件夾中包含slf4j-api-1.7.10.jar,但其清單中沒有Export-Package指令。

總的來說,我查看了所有包(felix,guava,logback-core,logback-classic,slf4j-api,koolapi,parent-app)的清單,以查看誰在使用/導出slf4j,並且只有logback-classic。 jar顯式導出org.slf4j.impl;版本= 1.7.7。

有沒有人有任何想法或建議如何解決衝突?

任何幫助將不勝感激!非常感謝, Joel

回答

2

該錯誤意味着您已經創建了一種情況,其中一個類加載器具有來自多個定義類加載器的類型ILoggerFactory的可見性。這在Java中不合法,因此是LinkageError

它會很難診斷肯定沒有完全捆綁內容和體現,但原因是可能slf4j-apikoolapi束的副本。像這樣嵌入庫可以除非這些類型通過導出類型上方法的簽名泄漏出去。由於此泄漏,您的應用程序捆綁包會暴露在ILoggerFactory類型的多個副本中。

該修復應該相對簡單:從koolapi中刪除slf4j-api.jar,並使koolapi將包導入爲正常依賴項。

相關問題