目前我正在做一个项目,我需要将第三方 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 at 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] at java.lang.Thread.run(Thread.java:745)[:1.8.0_25] 原因:java.lang。 NoClassDefFoundError: org/apache/log4j/LogManager at com.p*******h.eis.tools.logging.LoggingSetup.isConfigured(LoggingSetup.java:77) at com.p*******ho ****l.sdk。configurator.Configurator.checkLogging(Configurator.java:623) (------------第三方 jar 里面--------) 在com.p*******ho****l.sdk.configurator.Configurator.load(Configurator.java:383) 在 com.p*******ho****l.sdk .configurator.Configurator.getInstance(Configurator.java:72) 在 com.p*****ho****l.sdk.transactionProcessor.TransactionProcessor.(TransactionProcessor.java:43) 在 ca.esc.pbm .integr.chase.provider.service.PbmChaseApiImpl.getCCtokenFromChasePaymentGateWay(PbmChaseApiImpl.java:98)p*******ho****l.sdk.transactionProcessor.TransactionProcessor.(TransactionProcessor.java:43) at ca.esc.pbm.integr.chase.provider.service.PbmChaseApiImpl.getCCtokenFromChasePaymentGateWay(PbmChaseApiImpl.java :98)p*******ho****l.sdk.transactionProcessor.TransactionProcessor.(TransactionProcessor.java:43) at 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.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。