我正在尝试运行一个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(...),则这是您的问题。

08-18 16:11