gpt4 book ai didi

java - 使用嵌入式 OSGi 容器

转载 作者:搜寻专家 更新时间:2023-10-31 19:47:05 24 4
gpt4 key购买 nike

我正在构建一些模块,我想将其公开为 OSGi 包,而不需要对 OSGi 库有任何实际依赖性。使用声明性服务选项似乎可以做到这一点。

但是因为我对 OSGi 比较陌生(至少在创建包方面)我想测试它是否一切正常,为此我想设置一个小型嵌入式 OSGi 环境。

目前我有一个单独的包,它导出一个 API 并提供一个单一接口(interface)的 stub 实现。

我已按照以下教程设置环境:

嵌入式 felix 实现似乎可以正常工作,但是有两个问题:

Bundle bundle = felix.getBundleContext().installBundle("/path/to/bundle.jar")
bundle.start();
System.out.println(bundle.getRegisteredServices());

这会打印出 null,所以虽然 bundle 看起来启动正常,但它似乎没有公开任何服务。

其次,我想知道我是否必须做任何特别的事情才能启动并运行声明式服务。我的 Maven 依赖项是:

<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>

基于此处找到的电子邮件主题:http://mail-archives.apache.org/mod_mbox/felix-users/201111.mbox/%3CAE48C9B8172EFC48A028B60E8D6F96660143A5F336@sausexmbp02.amd.com%3E

我尝试将包添加到 felix 启动属性中:

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.apache.felix.scr; version=1.6.2");

然而,乍一看这似乎有点乐观。如何为嵌入式 felix 引擎启用声明式服务?

最佳答案

这两个问题的解决方案是在加载我自己的包之前将“scr”jar(用于解析声明性服务)作为一个包加载。

因为 jar 位于我的 maven 存储库中并且它应该跨系统工作,所以以下代码从它所在的任何位置加载 scr jar:

    URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class");
String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", "");
framework.getBundleContext().installBundle(jarPath).start();

在此之后我加载了我自己的包并且其中的服务被正确检测到。

在旁注中,您可以通过向初始 map 添加一些属性来启用日志记录:

    map.put("ds.showtrace", "true");
map.put("ds.showerrors", "true");

更多属性可以在 http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html 找到

为了将来引用,这里是我用来启动和运行它的所有代码

private void initialize() throws BundleException, URISyntaxException {
Map<String, String> map = new HashMap<String, String>();

// make sure the cache is cleaned
map.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);

// more properties available at: http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html
map.put("ds.showtrace", "true");
map.put("ds.showerrors", "true");

System.out.println("Building OSGi Framework");
FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
Framework framework = frameworkFactory.newFramework(map);

System.out.println("Starting OSGi Framework");
framework.start();

// declarative services dependency is necessary, otherwise they won't be picked up!
loadScrBundle(framework);

framework.getBundleContext().installBundle("file:/path/to/myBundle.jar").start();

ServiceReference reference = framework.getBundleContext().getServiceReference("my.Interface");
System.out.println(framework.getBundleContext().getService(reference));

for (Bundle bundle : framework.getBundleContext().getBundles()) {
System.out.println("Bundle: " + bundle.getSymbolicName());
if (bundle.getRegisteredServices() != null) {
for (ServiceReference serviceReference : bundle.getRegisteredServices())
System.out.println("\tRegistered service: " + serviceReference);
}
}
}

private void loadScrBundle(Framework framework) throws URISyntaxException, BundleException {
URL url = getClass().getClassLoader().getResource("org/apache/felix/scr/ScrService.class");
if (url == null)
throw new RuntimeException("Could not find the class org.apache.felix.scr.ScrService");
String jarPath = url.toURI().getSchemeSpecificPart().replaceAll("!.*", "");
System.out.println("Found declarative services implementation: " + jarPath);
framework.getBundleContext().installBundle(jarPath).start();
}

关于java - 使用嵌入式 OSGi 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16707784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com