我想在OpenStack4j平台上使用OSGi。具体来说,我使用的是阿帕奇卡拉夫 OSGi运行时(基于阿帕奇费利克斯 OSGi实现)。
当OpenStack4j试图发现连接器时,问题就出现了。根据快速入门正式文档指南,我试图用以下行实例化一个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这似乎与连接器的发现有关,但我不确定。
OpenStack4j不支持OSGi,是我要的。我试图根据这样的基于Apache特性的HTTPClient 4来解决声明HTTPClient 4的问题:
<?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的问题依然存在。
发布于 2015-01-26 22:04:05
恐怕你的问题没有简单的解决办法。关于资料来源,HttpExecutor正在通过ServiceLoader寻找一个HttpExecutorService。这很可能不起作用,因为ServiceLoader对BundleClassloaders一无所知,而且由于您从Bundle实例化它,它很可能缺少所需的包导入。另一个原因可能是ServiceLoader使用父类加载器。
所以你有三种可能性。
1)确保在包中也导入了org.openstack4j.core.transport.internal
2)将TCCL (线程上下文ClassLoader)设置为包含包的包的类加载器。所以ServiceLoader有能力找到它。
如尼尔所言,用白羊座的间谍苍蝇..。
https://stackoverflow.com/questions/28155513
复制相似问题