【发布时间】:2018-04-02 16:57:35
【问题描述】:
目前我正在做一个项目,我需要将第三方 JAR 加入到我们的 Karaf D-OSGi 应用程序中。我们不打算更改 jar 中的任何代码,但我们可以使用有限的源代码对其进行调试。
问题在于第三方 jar 依赖于 log4j-1.2.9 jar。但是在运行时调用第三方jar时,从第三方jar中找不到logManager.class。
这是来自 Karaf 的异常日志。
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) 在 ca.esc.pbm.integr.chase.provider.service.PbmChaseApiImpl.getCCtokenFromChasePaymentGateWay(PbmChaseApiImpl.java:98)
... 36 more
原因:java.lang.ClassNotFoundException:org.ops4j.pax.logging.pax-logging-api [1] 找不到 org.apache.log4j.LogManager 在 org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574) 在 org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) ... ... 50 更多
karaf@root()>
在 bundle 中, pom.xml 具有 log4j 1.2.8 依赖项。 在 bnd.bnd 中,Export-Package : org.apache.log4j.*, .....
我已经检查了从 maven 生成的包 jar,log4j 包/jar 被导入到包和 Karaf 运行时。
我做了一些调试/研究,看起来 Pax 记录器接管/委托了 Log4j,它从包中隐藏了 LogManager。
另外,我尝试在不涉及第三方 Jar 的情况下直接从捆绑包中调用 LogManager,我得到了同样的异常,即找不到 LogManager.class。
我了解 Karaf 使用 Pax 记录器进行日志记录并将 log4j 实现委托给 Pax,但是在我的情况下,我怎样才能让无法触及的 Jar 类成功调用 LogManager?
谢谢
保罗·N.
【问题讨论】:
-
我的Karaf版本是4.0.8