在使用 Gradle 和 BND 构建的 OSGi 环境中配置 pax-logging

Configuring pax-logging in OSGi environment built with Gradle and BND

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

我正在使用 Gradle 6.8.3

我有一个 OSGi 包的 build.gradle 文件,该文件旨在使用以下方法向其他包公开日志记录功能:

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 核心的一部分,因此我从同一个包中导出以下内容以启用 Log4J2 核心 类在依赖于日志包的其他包中可见:

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 片段的需要,并为多捆绑环境提供更简单的配置。也许有一系列系统的事情可以解决这个问题?

更新

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

这仍然存在如何访问代码中其他地方的 FileAppnder 之类的问题,但它回答了关于我的方法有什么问题的问题。