Ошибка запуска проекта Maven OSGi
Я пытаюсь запустить 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 Framework, затем пытаюсь запустить службу:
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>
1 ответ
Я могу представить две причины:
Сервис не зарегистрирован
Вы уверены, что сервис зарегистрирован? Вы не опубликовали код своего активатора. Ваша служба зарегистрирована в методе запуска Активатора?
Экземпляр службы реализует другой тип HelloworldService
Возможно ли, что любой из ваших пакетов в контейнере содержит тип HelloWorldService? Посмотрите Javadoc BundleContext.getServiceReference (...):
... и пакеты для имен классов, под которыми были зарегистрированы службы, соответствуют пакетам контекстного пакета, как определено в ServiceReference.isAssignableTo(Bundle, String).
Если пакет инфраструктуры видит другой экземпляр типа HelloWorldService, чем пакет, который зарегистрировал службу, методы BundleContext.getServiceReference контекста пакета инфраструктуры не будут возвращать ссылку на службу.
Попробуйте вызвать BundleContext.getAllServiceReferences (...). Если это возвращает ссылку на службу, но BundleContext.getServiceReference (...) нет, это ваша проблема.