有两件事要记住;1)您的包可能需要一些额外的元数据用于依赖注入框架,并且 2)您需要部署 DI 框架的运行时。
依赖注入不是核心 OSGi(即 Felix 框架)的一部分,因此您必须先部署 iPOJO 捆绑包,然后再部署自己的捆绑包。此外,您需要添加 IPOJO 所需的元数据,谷歌“maven-ipojo-plugin”以获取更多信息。
如果您正在寻找一个比 Felix 本身更简单的容器,那么请尝试Karaf(它带有许多企业附加功能)。
就个人而言,我喜欢声明式服务(所以 +1 Dmytro),因为它非常简单,只是从 OSGi 中删除了样板代码(记住也要部署它并在你的包中提供 component.xml,请参阅maven-scr-plugin了解更多信息) .
编辑
(回答评论并链接到下面的 tarball)
我将 @Service 注释从 Producer 移到了 ProducerImpl。
通过添加一个 unbind() 方法并更改 @Reference ,生成的 SCR component.xml 对消费者来说并不完全正确:
//...
import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
import static org.apache.felix.scr.annotations.ReferencePolicy.DYNAMIC;
//...
@Component
public class Consumer
{
@Reference(policy = DYNAMIC, cardinality = MANDATORY_UNARY)
private Producer producer;
public void unbindProducer() {
System.out.println("Producer unbound.");
this.producer = null;
}
//...
}
部署 Maven
当您使用 maven 时,请为 maven 安装 Pax Url,这样您就可以轻松地从本地和远程存储库安装包。
首先让 maven 为您下载一个版本(pax-url-mvn 版本 1.3.5 可用)然后安装文件(或复制到 Felix 捆绑目录)
-> install file:/YOUR_PATH_TO_MAVEN_REPO/.m2/repository/org/ops4j/pax/url/pax-url-mvn/1.3.5/pax-url-mvn-1.3.5.jar
Bundle ID: 7
-> start 7
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.net.ssl) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.xml.parsers) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.cm)(version>=1.0.0)(!(version>=2.0.0))) -> [2.0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.url)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.w3c.dom) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.xml.sax) -> [0]
->
您现在可以使用 mvn URL 处理程序从本地存储库安装自己的包:
-> install mvn:com.examples/producer/1.0.1
Bundle ID: 10
-> start 10
-> install mvn:com.examples/consumer/1.0.1
Bundle ID: 11
-> start 11
DEBUG: WIRE: [11.0] osgi.wiring.package; (&(osgi.wiring.package=com.examples.producer)(version>=1.0.0)(!(version>=2.0.0))) -> [10.0]
Producer bound.
Consumer activate
Aloha.
->