大家好,
使用Kura Linux模拟器,我正在运行Kura文档中的Hello World示例 http://eclipse.github.io/kura/dev/deploying-bundles.html#remote-target-device
我设法在本地仿真模式下运行OSGi插件,这里是Kura仿真器Linux / java日志的输出。
21:14:18,036 [Component Resolve Thread] INFO HelloOsgi:15 - Bundle org.eclipse.kura.example.hello_osgi has started!
但是,当我尝试从控制台启动/停止捆绑包时,我只设法实现安装步骤。 以下是安装后Host OSGi控制台的一些相关输出。
osgi> install file:/home/tihomir/workspace/kura/plugins/org.eclipse.kura.example.hello_osgi_1.0.0.201712111129.jar
Bundle id is 1020
LastModified 1513020115678
Headers Bundle-ManifestVersion = 2
Bundle-Name = Hello World Example with Logger
Bundle-RequiredExecutionEnvironment = JavaSE-1.8
Bundle-SymbolicName = org.eclipse.kura.example.hello_osgi
Bundle-Version = 1.0.0.201712111129
Import-Package = org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.3.0",
org.osgi.service.component;version="1.2.2",
org.osgi.service.component.annotations;version="1.2.0";resolution:=optional,
org.osgi.util.tracker;version="1.3.1",org.4j;version="1.7.21"
Manifest-Version = 1.0
Service-Component = OSGI-INF/*.xml
Location file:/home/tihomir/workspace/kura/plugins/org.eclipse.kura.example.hello_osgi_1.0.0.201712111129.jar
State 2
Bundle 1020|Installed | 1|org.eclipse.kura.example.hello_osgi (1.0.0.201712111129)
Version 1.0.0.201712111129
RegisteredServices null
ServicesInUse null
Module osgi.identity; osgi.identity="org.eclipse.kura.example.hello_osgi"; type="osgi.bundle"; version:Version="1.0.0.201712111129" [id=1020]
SymbolicName org.eclipse.kura.example.hello_osgi
BundleContext null
BundleId 1020
osgi> ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.12.50.v20170928-1321
Fragments=1
997 RESOLVED org.slf4j.api_1.7.2.v20121108-1250
Fragments=5, 998
998 RESOLVED org.slf4j.impl.log4j12_1.7.2.v20131105-2200
Master=997
1020 INSTALLED org.eclipse.kura.example.hello_osgi_1.0.0.201712111129
但是现在,当我尝试激活捆绑包时,尽管上面的输出显示org.slf4j已解决,但我得到以下异常
osgi> start 1020
gogo: BundleException: Could not resolve module: org.eclipse.kura.example.hello_osgi [1020]
Unresolved requirement: Import-Package: org.slf4j; version="1.7.21"
我在Debian 9上运行模拟器。 这里也是插件清单
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Hello World Example with Logger
Bundle-SymbolicName: org.eclipse.kura.example.hello_osgi
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Service-Component: OSGI-INF/*.xml
Import-Package: org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.3.0",
org.osgi.service.component;version="1.2.2",
org.osgi.service.component.annotations;version="1.2.0";resolution:=optional,
org.osgi.util.tracker;version="1.3.1",
org.slf4j;version="1.7.21"
我已经尝试了一些我在这里和Eclipse论坛上发现的检查/修复,但没有任何效果,所以欢迎任何新的建议。
答案 0 :(得分:0)
编辑项目的POM并降级SLF4j,因为Kura似乎提供SLF4j v 1.7。 2 ,而您的捆绑包至少需要v 1.7。 21
根据@ NeilBartlett的评论,启动SLF4j捆绑包不需要捆绑包的依赖关系来解决。我将这部分答案留在这里作为提醒,如果您没有看到来自您的捆绑包的任何日志行。
SLF4j捆绑包未启动(ss
将其显示为处于RESOLVED状态)。尝试使用start 997 998
启动它们。
答案 1 :(得分:0)
您的Import-Package
范围一般看起来不对。例如,你有这个:
Import-Package: org.slf4j;version="1.7.21"
首先:不需要指定微段(即最后一段,21)。微型版本表示错误修复,性能改进,文档更改等。这些都不会对您作为消费者产生任何语义影响。因此,您只需从版本1.7
导入,因为下面的任何微型版本都将与您的代码兼容。
第二:你的进口范围没有上限!这意味着您将从版本1.7.21
或任何更高版本导入,直至无穷大。因此,虽然你对你的范围的底端非常肛门,但你对上端非常无忧无虑!您应该按如下方式限制范围:
Import-Package: org.slf4j; version="[1.7,2.0)"
这允许您的捆绑包导入1.7版本但不包括Slf4j的2.0版本(如果存在的话)。这是正确的,因为版本2表明Slf4j API发生了重大变化。
对所有其他进口产品的建议相同:
Import-Package: org.osgi.framework;version="[1.3, 2.0)",
org.osgi.service.component;version="[1.2, 2.0)",
... etc
如果您使用bnd或其衍生工具之一来生成清单,那么您将不必考虑其中任何一项,而且这一切都是正确的。
答案 2 :(得分:0)
感谢@NeilBartlett @AlessandroDaRugna
事实证明,这个例子毕竟是按预期工作的。 这是一个确定文档中的控制台的问题,因为在Eclipse IDE中,您可以选择两个选项。 Kura Emulator Linux / java控制台,显然是一个指令,它不是非常用户友好,需要一些时间习惯。 另一个控制台,主机OSGi,我无法弄明白,但它似乎与仿真器分离,可能是一种通用接口。
再次感谢您的支持。