嵌入式Apache Felix如何配置LogService?
How to configure LogService for embedded Apache Felix?
我正在尝试将 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();
这是我的包清单的样子:
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)"
安装我的包时,我收到以下异常日志:
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
添加到 SYSTEMBUNDLE_ACTIVATORS_PROP
但没有效果。
如果您可以将包含 org.osgi.service.log 的包安装到您的嵌入式 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 容器)中注册实现此接口的服务时,您才想从外部类加载器使用此包。
我正在尝试将 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();
这是我的包清单的样子:
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)"
安装我的包时,我收到以下异常日志:
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
添加到 SYSTEMBUNDLE_ACTIVATORS_PROP
但没有效果。
如果您可以将包含 org.osgi.service.log 的包安装到您的嵌入式 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 容器)中注册实现此接口的服务时,您才想从外部类加载器使用此包。