【问题标题】:Use OpenStack4j in an OSGi platform在 OSGi 平台中使用 OpenStack4j
【发布时间】:2015-08-18 19:20:29
【问题描述】:

我想在 OSGi 平台中使用OpenStack4j。具体来说,我正在使用Apache Karaf OSGi 运行时(基于Apache Felix OSGi 实现)。

当 OpenStack4j 尝试发现连接器时会出现问题。基于Getting started官方文档指南,我正在尝试使用此行实例化一个v2.0客户端:

OSClient os = OSFactory.builder()
                .endpoint("http://host:5000/v2.0")
                .credentials("user", "password")
                .tenantName("tenant")
                .authenticate();

我得到了这个例外:

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

好像和Connector发现有关,但我不确定。

OpenStack4j 不支持 OSGi,I asked for it。我试图解决基于HTTPClient 4 声明Apache Karaf feature 的问题,如下所示:

<?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>

但这并没有解决我的问题。

如何在我的 OSGi 环境中使用 OpenStack4j?

编辑: 我发现 NullPointerException 是由代码中的错误引起的(这里是 issue)。已修复。

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

【问题讨论】:

    标签: osgi openstack


    【解决方案1】:

    我担心您的问题没有简单的解决方案。关于sources,HttpExecutor 正在通过ServiceLoader 寻找HttpExecutorService。这很可能不起作用,因为 ServiceLoader 对 BundleClassloader 一无所知,并且由于您从 Bundle 实例化它,因此很可能缺少所需的包导入。另一个原因可能是 ServiceLoader 使用了父类加载器。

    所以你有三种可能性。
    1) 确保您还在捆绑包中导入 org.openstack4j.core.transport.internal
    2)将TCCL(Thread Context ClassLoader)设置为包含包的bundle的类加载器。所以 ServiceLoader 能够找到它。
    3) 正如尼尔所说,使用 Aries SPY Fly ...

    【讨论】:

    • 您可以尝试使用Apache Aries SPI Fly,它连接了 OSGi 和 ServiceLoader。
    • 1) 和 2) 不起作用。我们已经测试了两者的许多组合 (more info here)。 3) 我认为我们需要对此进行更多分析,但我们已经了解到我们需要 OSGi 5,并且我们正在使用 OSGi 4.x
    猜你喜欢
    • 2014-07-26
    • 2017-12-05
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2013-11-22
    • 2011-02-22
    • 2013-02-14
    相关资源
    最近更新 更多