在使用 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
之类的问题,但它回答了关于我的方法有什么问题的问题。
我正在尝试通过 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
之类的问题,但它回答了关于我的方法有什么问题的问题。