0

我正在尝试通过 Pax Logging 让 Log4J2 工作,但在线文档专注于 Log4J (v1)。我的项目是 Java,带有 BND 插件的用于针对 Equinox 环境的 OSGi 包的 Gradle。

我正在使用 Gradle 6.8.3

我有build.gradle一个 OSGi 包的文件,旨在将日志记录功能公开给其他包,使用:

implementation 'org.ops4j.pax.logging:pax-logging-api:2.1.0'
implementation 'org.ops4j.pax.logging:pax-logging-log4j2:2.1.0'

在我的 BND 文件中,我包含以下导入:

Import-Package: org.apache.logging.log4j;version="2.17.1";provider=paxlogging, org.apache.commons.logging;version="[1.1.1,2)";provider=paxlogging, org.apache.logging.log4j.core;version="2.17.1";provider=paxlogging

由于我的项目定义了文件附加程序,它们不构成 Log4J2 API 的一部分,而是 Log4J2 Core,因此我从同一个包中导出以下内容,以使 Log4J2 Core 类在依赖于日志记录包的其他包中具有可见性:

Export-Package: com.mycompany.loggingbundle, org.apache.logging.log4j, org.apache.logging.log4j.message, org.apache.logging.log4j.util, org.apache.logging.log4j.core;version="2.17.1", org.apache.logging.log4j.core.appender;version="2.17.1", org.apache.logging.log4j.core.filter;version="2.17.1", org.apache.logging.log4j.core.impl;version="2.17.1", org.apache.logging.log4j.spi;version="2.17.1"

一切都可以编译,构建和安装。

在运行时,我有一个问题:

org.osgi.framework.BundleException: Could not resolve module: com.mycompany.otherbundle [1306]
  Unresolved requirement: Require-Bundle: com.mycompany.loggingbundle
    -> Bundle-SymbolicName: com.mycompany.loggingbundle; bundle-version="<hidden>"; singleton:="true"
       com.mycompany.loggingbundle [1311]
         Unresolved requirement: Import-Package: org.apache.logging.log4j.core; provider="paxlogging"; version="2.17.1"

    at org.eclipse.osgi.container.Module.start(Module.java:434)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1582)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1561)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1533)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1476)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)

希望一些 OSGi 专家知道我的问题所在,因为使用 Pax Logging 的全部原因是避免创建 Log4J2 片段的需要,并为多捆绑环境提供更简单的配置。也许有一系列系统的事情可以解决这个问题?

4

1 回答 1

0

更新

我打开了 pax-logging-log4j2 JAR 文件来查看它的清单,可以看到它没有从中导出任何东西,org.apache.logging.log4j.core所以我从我的包中重新导出它永远无法提供我希望的核心包。

这仍然留下了如何访问FileAppnder代码中其他地方的问题,但它回答了我的方法有什么问题的问题。

于 2022-03-01T12:34:08.140 回答