0

我正在尝试运行一个 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>
4

1 回答 1

1

我可以想象两个原因:

服务未注册

您确定该服务已注册?您没有发布激活器的代码。你的服务是在Activator的start方法中注册的吗?

服务实例实现了另一个 HelloworldService 类型

容器中的任何捆绑包都可能包含 HelloWorldService 类型吗?请参阅BundleContext.getServiceReference(...)的 Javadoc :

...并且注册服务的类名的包与 ServiceReference.isAssignableTo(Bundle, String) 中定义的上下文包的包相匹配。

如果框架包看到的HelloWorldService类型的实例不是注册服务的包,框架包上下文的BundleContext.getServiceReference方法将不会返回服务的引用。

尝试调用BundleContext.getAllServiceReferences(...)。如果返回一个服务引用但BundleContext.getServiceReference(...)没有,这是你的问题。

于 2015-12-31T08:21:31.330 回答