目前我正在开展一个项目,我需要将第三方JAR传播到我们的Karaf D-OSGi应用程序中。我们不打算更改jar中的任何代码,但是使用有限的源代码我们可以调试它。
问题是第三方jar依赖于log4j-1.2.9 jar。但是当在运行时调用第三方jar时,无法从第三方jar中找到logManager.class。
karaf@root()> lde
org.apache.cxf.interceptor.Fault:org / apache / log4j / LogManager 在org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)[166:org.apache.cxf.cxf-core:3.1.7] 在org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)[166:org.apache.cxf.cxf-core:3.1.7] ... org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)[115:org.eclipse.jetty.util:9.2.19.v20160908] 在org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:555)[115:org.eclipse.jetty.util:9.2.19.v20160908] 在java.lang.Thread.run(Thread.java:745)[:1.8.0_25] 引起:java.lang.NoClassDefFoundError:org / apache / log4j / LogManager 在com.p ******* h.eis.tools.logging.LoggingSetup.isConfigured(LoggingSetup.java:77) 在com.p ******* ho **** l.sdk.configurator.Configurator.checkLogging(Configurator.java:623)(------------在第三方jar中------------------) 在com.p ******* h.o **** l.sdk.configurator.Configurator.load(Configurator.java:383) 在com.p ******* h.o **** l.sdk.configurator.Configurator.getInstance(Configurator.java:72) 在com.p ******* h.o **** l.sdk.transactionProcessor.TransactionProcessor。(TransactionProcessor.java:43) at ca.esc.pbm.integr.chase.provider.service.PbmChaseApiImpl.getCCtokenFromChasePaymentGateWay(pBmChaseApiImpl.java:98)
... 36 more
引起:org.ops4j.pax.logx.pax-logging-api [1]找不到java.lang.ClassNotFoundException:org.apache.log4j.LogManager 在org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574) 在org.apache.felix.framework.BundleWiringImpl.access $ 400(BundleWiringImpl.java:79) ... ......还有50个
我已经从maven检查了生成的bundle jar,log4j包/ jar被导入到bundle和Karaf运行时。
我进行了一些调试/研究,看起来像Pax记录器接管/委托Log4j,它从包中隐藏了LogManager。
另外,我试图直接从捆绑中调用LogManager而不涉及第三方Jar,我得到了无法找到LogManager.class的相同异常。
我理解Karaf使用Pax logger进行日志记录并将log4j实现委托给Pax,但在我的情况下,如何让不可触及的Jar类成功调用LogManager?
由于
保罗·N。答案 0 :(得分:0)
你可以检查的事情:
在类路径中搜索具有logmanager类的jar文件,并尝试使用chase特定的log4j jar文件覆盖。