在我目前的应用程序中,我想通过用户界面在运行时创建和配置osgi服务。我查看了OSGi Metatype规范,但它只支持简单的类型属性。
所以我的问题是:有没有一个很好的理由为什么不支持其他osgi服务等属性类型,有没有人知道已经存在的类似这样的项目呢?
更新
进一步澄清我的问题:
我想要做的是根据软件用户的需要创建和配置新服务。如果将新的服务接口添加到系统中,这甚至可以工作。
假设我有一个发送通知的服务界面
public interface NotificationService {
void notify(Notification n);
}
以及向例如发送通知的实现推特。通过Metatype规范,我可以编码twitter服务需要用户名和密码的信息。这允许我在运行时动态创建UI以创建新的Twitter通知服务。
这适用于简单的数据类型,但Metatype规范不处理与其他服务的依赖关系。例如。假设Notification
有文件附件,因此Twitter服务需要FileUpload服务来存储文件。
答案 0 :(得分:0)
您始终可以使用BundleContext#registerService()注入新服务,但此时的服务必须已初始化并准备运行。您可能会发现OSGi 4.2规范的新Blueprint服务很有用 - 甚至是动态服务,它更老但更广泛。
最后,这取决于你想做什么。当你在运行时说“创建”和“配置”osgi服务时,你的意思是什么?
答案 1 :(得分:0)
因此,在您的示例中,您基本上是说可以配置服务的实现,并且该配置可能表明实现需要其他服务。基本上,您正在寻找一个允许您在代码中声明实现的依赖关系的系统,而不是在静态XML文件中(如声明式服务和其他大多数人所做的那样)。
您的问题的解决方案是使用Apache Felix依赖管理器。它有一个声明性Java API,允许您在运行时添加和删除依赖项。一些基本的例子可以在这里找到:http://felix.apache.org/site/apache-felix-dependency-manager-getting-started.html我建议你从源代码构建一个3.0.0-SNAPSHOT,因为这是迄今为止最新且最好的,相当稳定。
如果有帮助,我可以为您上面描述的示例提供实际示例代码。让我知道。