首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenStack4j平台上使用OSGi

在OpenStack4j平台上使用OSGi
EN

Stack Overflow用户
提问于 2015-01-26 17:35:40
回答 1查看 494关注 0票数 0

我想在OpenStack4j平台上使用OSGi。具体来说,我使用的是阿帕奇卡拉夫 OSGi运行时(基于阿帕奇费利克斯 OSGi实现)。

当OpenStack4j试图发现连接器时,问题就出现了。根据快速入门正式文档指南,我试图用以下行实例化一个v2.0客户机:

代码语言:javascript
复制
OSClient os = OSFactory.builder()
                .endpoint("http://host:5000/v2.0")
                .credentials("user", "password")
                .tenantName("tenant")
                .authenticate();

我得到了一个例外:

代码语言:javascript
复制
Caused by: java.lang.ExceptionInInitializerError
    at org.openstack4j.openstack.internal.OSAuthenticator.authenticateV2(OSAuthenticator.java:77)
    at org.openstack4j.openstack.internal.OSAuthenticator.invoke(OSAuthenticator.java:41)
    at org.openstack4j.openstack.client.OSClientBuilder$ClientV2.authenticate(OSClientBuilder.java:84)
    at org.openstack4j.openstack.client.OSClientBuilder$ClientV2.authenticate(OSClientBuilder.java:65)
    ... 19 more
Caused by: java.lang.NullPointerException
    at org.openstack4j.core.transport.internal.HttpExecutor.initService(HttpExecutor.java:32)
    at org.openstack4j.core.transport.internal.HttpExecutor.<init>(HttpExecutor.java:25)
    at org.openstack4j.core.transport.internal.HttpExecutor.<clinit>(HttpExecutor.java:20)
    ... 27 more

这似乎与连接器的发现有关,但我不确定。

OpenStack4j不支持OSGi,是我要的。我试图根据这样的基于Apache特性HTTPClient 4来解决声明HTTPClient 4的问题:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<features>

    <feature name="openstack4j" version="${openstack4j-version}">
        <feature version="${openstack4j-version}">openstack4j-httpclient</feature>

        <bundle dependency="true">mvn:com.google.guava/guava/17.0</bundle>

        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-databind/2.3.5</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-annotations/2.3.5</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-core/2.3.5</bundle>

        <bundle dependency="true">mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.3.5</bundle>
        <bundle dependency="true">mvn:org.yaml/snakeyaml/1.14</bundle>

        <bundle dependency="true">wrap:mvn:com.google.code.findbugs/jsr305/2.0.0</bundle>

        <bundle>wrap:mvn:org.pacesys/openstack4j-core/${openstack4j-version}</bundle>       
    </feature>

    <feature name="openstack4j-httpclient" version="${openstack4j-version}">
        <bundle dependency="true">wrap:mvn:commons-logging/commons-logging/${commons.logging.version}</bundle>

        <bundle dependency="true">wrap:mvn:org.apache.httpcomponents/httpclient/4.3.1</bundle>
        <bundle dependency="true">wrap:mvn:org.apache.httpcomponents/httpcore/4.3</bundle>

        <bundle>wrap:mvn:org.pacesys.openstack4j.connectors/openstack4j-httpclient/${openstack4j-version}</bundle>      
    </feature>

</features>

但这并不能解决我的问题。

如何在OpenStack4j环境中使用OSGi?

编辑:我发现NullPointerException是由代码中的一个bug引起的(这里是问题)。已经修好了。

无论如何,SPI的问题依然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 22:04:05

恐怕你的问题没有简单的解决办法。关于资料来源,HttpExecutor正在通过ServiceLoader寻找一个HttpExecutorService。这很可能不起作用,因为ServiceLoader对BundleClassloaders一无所知,而且由于您从Bundle实例化它,它很可能缺少所需的包导入。另一个原因可能是ServiceLoader使用父类加载器。

所以你有三种可能性。

1)确保在包中也导入了org.openstack4j.core.transport.internal

2)将TCCL (线程上下文ClassLoader)设置为包含包的包的类加载器。所以ServiceLoader有能力找到它。

如尼尔所言,用白羊座的间谍苍蝇..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28155513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档