我正在尝试运行一个Maven OSGi捆绑项目,但得到:
Exception in thread "main" java.lang.NullPointerException: Specified service reference cannot be null.
在
System.out.println(framework.getBundleContext().getService(reference));
下面的initialize()
中。我似乎无法正确解决。我是OSGi的新手。请帮助我使项目运行。谢谢大家。
这是我嵌入OSGi框架,然后尝试启动服务的方式:
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);
map.put("ds.showtrace", "true");
map.put("ds.showerrors", "true");
FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
Framework framework = frameworkFactory.newFramework(map);
System.out.println("Starting OSGi Framework");
framework.init();
framework.start();
loadScrBundle(framework);
framework.getBundleContext().installBundle("file:" + "D:/core-1.0.jar").start();
ServiceReference<?> reference = framework.getBundleContext()
.getServiceReference(HelloWorldService.class.getName());
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);
}
}
}
这就是我导出
rev.core.api
服务包的方式:<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
<Export-Package>rev.core.api</Export-Package>
<Bundle-Activator>rev.core.impl.Activator</Bundle-Activator>
<Bundle-Vendor>Rev CAIT</Bundle-Vendor>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
最佳答案
我可以想象两个原因:
该服务未注册
您确定服务已注册吗?您没有发布激活器的代码。您的服务是否已在Activator的启动方法中注册?
服务实例实现了另一个HelloworldService类型
容器中的任何捆绑软件是否都可能包含HelloWorldService类型?请参阅BundleContext.getServiceReference(...)的Javadoc:
...以及用于注册服务的类名的包与ServiceReference.isAssignableTo(Bundle,String)中定义的上下文包的包匹配。
如果框架捆绑包看到的是HelloWorldService类型的实例,而不是注册服务的捆绑包,则框架捆绑包上下文的BundleContext.getServiceReference方法将不会返回该服务的引用。
尝试调用BundleContext.getAllServiceReferences(...)。如果返回服务引用,但不返回BundleContext.getServiceReference(...),则这是您的问题。