当前位置: 首页 > 知识库问答 >
问题:

Karaf bundle找不到Log4j LogManager。在运行时初始化。

鲍建业
2023-03-14

目前我正在做一个项目,我需要将第三方JAR转换到我们的Karaf D-OSGi应用程序中。我们不想更改jar中的任何代码,但由于源代码有限,我们可以调试到jar中。

问题是第三方jar依赖于log4j-1.2.9 jar。然而,当在运行时调用第三方jar时,无法从第三方jar中找到logManager.class。

karaf@root()> lde

组织。阿帕奇。cxf。拦截器。错误:org/apache/log4j/LogManager位于org。阿帕奇。cxf。服务调用者。抽象调用程序。createFault(AbstractInvoker.java:162)[166:org.apache.cxf.cxf核心:3.1.7]位于org。阿帕奇。cxf。服务调用者。抽象调用程序。invoke(AbstractInvoker.java:128)[166:org.apache.cxf.cxf核心:3.1.7]。。。组织。日食码头。util。线QueuedThreadPool。org上的runJob(QueuedThreadPool.java:635)[115:org.eclipse.jetty.util:9.2.19.v20160908]。日食码头。util。线QueuedThreadPool$3。在java上运行(QueuedThreadPool.java:555)[115:org.eclipse.jetty.util:9.2.19.v20160908]。朗。丝线。运行(Thread.java:745)[:1.8.0_25]由:java引起。lang.NoClassDefFoundError:org/apache/log4j/LogManager,位于com。p*********h.eis。工具。登录中。日志设置。我在com上配置了(LoggingSetup.java:77)。p**********h.o****l.sdk。配置器。配置器。com上的checkLogging(Configurator.java:623)(--------------在第三方jar中-------------------)。p**********h.o****l.sdk。配置器。配置器。在com上加载(Configurator.java:383)。p**********h.o****l.sdk。配置器。配置器。com上的getInstance(Configurator.java:72)。p**********h.o****l.sdk。事务处理器。事务处理器。(TransactionProcessor.java:43)位于ca.esc。pbm。整数。追赶供应商。服务PBMChaseAppiImpl。getCCtokenFromChasePaymentGateWay(pbmchaseAppIImpl.java:98)

    ... 36 more

原因:java。lang.ClassNotFoundException:org。阿帕奇。log4j。组织未找到LogManager。ops4j。圣像牌。登录中。组织上的pax日志api[1]。阿帕奇。费利克斯。框架BundleWiringImpl。在org上查找classorresourcebydelegation(BundleWiringImpl.java:1574)。阿帕奇。费利克斯。框架BundleWiringImpl。访问$400(BundleWiringImpl.java:79)。。。50多

在捆绑包中,pom.xml具有log4j 1.2.8依赖项。在bnd.bnd中,Export-Package:org.apache.log4j。*,......

我已经检查了maven生成的bundle jar,log4j包/jar被导入到bundle中,并在Karaf运行时被导入。

我做了一些调试/研究,看起来像Pax记录器接管/委托Log4j从捆绑包中隐藏LogManager。

另外,我试图在不涉及第三方Jar的情况下直接从包中调用LogManager,得到了与LogManager相同的异常。找不到类。

我知道Karaf使用Pax记录器进行日志记录,并将log4j实现委托给Pax,但是在我的情况下,我如何让不可触摸的Jar类成功调用LogManager?

谢啦

保罗N.

共有1个答案

廖招
2023-03-14

您可以检查以下几点:

在类路径中搜索具有logmanager类的jar文件,并尝试使用特定于chase的log4j jar文件进行重写。

 类似资料:
  • 根据文件: 在更新发生后立即调用。初始渲染时不调用此方法。 我们可以使用新的钩子来模拟,但是每次渲染后,甚至第一次渲染后都会运行。如何使其不在初始渲染时运行? 正如您在下面的示例中所看到的,在初始渲染过程中打印了,但是在初始渲染过程中没有打印。

  • 问题内容: 我在本地计算机上使用创建了一个新的Rails项目,但是当我尝试启动服务器时,我得到了:找不到JavaScript运行时。请参阅以获取可用运行时列表。() 注意:这与Heroku无关。 问题答案: 安装诸如nodejs之类的javascript运行时库可以解决此问题 要在ubuntu上安装nodejs,可以在终端中键入以下命令: 要在使用yum的系统上安装nodejs,请在终端中键入以下

  • 我用flyway maven插件做了一些实验。我没有空数据库,所以我需要一个初始ddl脚本。我遵循flyway wiki中的说明: 我将sql脚本命名为V1\uu Base\u Migration。sql,在src/main/resources/db/migration中。 flyway-maven-plugin的配置如下所示: 当我在cmd上调用mvn install flyway:init并查

  • 我一直在查看Sitecore。内核,但似乎找不到Sitecore运行初始化管道的位置。它是在每个页面请求上运行还是在应用程序启动时只运行一次?你能告诉我为这个管道调用Run方法的确切位置吗? 更新我最后问这个问题的原因是因为我在Sitecore的代码中追溯了管道的执行。这是我发现的: 管道运行处理器... 调用... 调用... 创建新的对象 事情变得有点模糊。。。 返回新路由HttpHandle

  • 我有一个JavaFX应用程序,它与用Java编写的控制器类一起使用FXML。在Java控制器中,在FXML节点初始化之前,我需要小心不要对其进行操作(否则我会得到一个NullPointerException),这在运行初始化方法之前是无法保证的。所以我发现自己经常这样做: 控制器在FXML文件中设置如下: 然后是Java文件中的控制器。 这是可行的,但它笨重且重复。我必须创建globalValue