java - 如何为嵌入式Apache Felix配置LogService?

标签 java logging osgi apache-felix osgi-bundle

我正在尝试将 Apache Felix 嵌入到我的应用程序中。它工作得很好,除了我的一个包启动时依赖于 osg.osgi.service.log 。

以下是我启动嵌入式 Felix 的方法:

    Map<String, Object> config = new HashMap<>();
    config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.osgi.service.log,my.custom.package");
    config.put(FelixConstants.LOG_LEVEL_PROP, "3");

    felix = new Felix(config);

    try {
        felix.start();
    } catch (BundleException e) {
        //...
    }

    felix.getBundleContext().installBundle("file:my-bundle.jar").start();

这是我的捆绑 list 的样子:

    Export-Package: my.custom.bundle;uses:="my.custom.package,org.osgi.framework,org.osgi.service.log";version="0.0.1"
    Import-Package: my.custom.package,org.osgi.framework;version="[1.5,2)",org.osgi.service.log;version="[1.3,2)"

安装我的 bundle 时,我收到以下异常日志:

    org.osgi.framework.BundleException: Unable to resolve my.custom.bundle [1](R 1.0): missing requirement [my.custom.bundle [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.log (version>=1.3.0)(!(version>=2.0.0))) Unresolved requirements: [[my.custom.bundle [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.log)(version>=1.3.0)(!(version>=2.0.0)))]
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
        at java.lang.Thread.run(Thread.java:745)

我尝试导入将org.apache.felix.log添加到FRAMEWORK_SYSTEMPACKAGES_EXTRA,或添加org.apache.felix.log.Activator code> 到 SYSTEMBUNDLE_ACTIVATORS_PROP 没有效果。

最佳答案

如果您可以将包含 org.osgi.service.log 的 bundle 安装到嵌入式 OSGi 容器中,那就最好了。

如果您确实想从外部类加载器使用它,则应该在 org.osgi.framework.system.packages.extra 配置中指定包的版本。

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.osgi.service.log;version="x.x.x",my.custom.package");

其中 x.x.x 应替换为类路径中包的版本。应大于或等于 1.3.0 且小于 2.0.0。

我可以想象,只有当您在容器应用程序(嵌入 OSGi 容器)中注册实现此接口(interface)的服务时,您才想从外部类加载器使用此包。

关于java - 如何为嵌入式Apache Felix配置LogService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35384349/

相关文章:

java - list.iterator() 可以返回 null 吗?

java - 失去连接后 Eclipse Milo 不会重新连接到服务器 - 订阅

java - 批量删除具有给定属性(或多个属性)的所有实体

java - Struts setter方法错误的参数传递

java - Log4j2 - RootLogger 附加程序不工作

java - 从 Felix 获取具体实现

eclipse - 在 ESF Emulator 中运行 Hello_Osgi 在 Eclipse EE、Kura、Ubuntu Linux 上崩溃

java - OSGi - 我应该为每个包创建服务跟踪器吗?

java - log4j2 - StatusLogger 未找到 Log4j 2 配置文件。使用默认配置

ios - print - 后台或主线程操作