【问题标题】:qi4j on osgi fails to bootstraposgi 上的 qi4j 无法引导
【发布时间】:2015-03-25 01:41:01
【问题描述】:

有人设法让 qi4j 在像 servicemix 这样的 OSGi 环境中运行吗?我试过没有成功。它不断地告诉我:

[Application(6)] The activate method has thrown an exception
org.qi4j.bootstrap.BootstrapException: Can not create Qi4j without a 
    Qi4j Runtime.
at org.qi4j.bootstrap.Energy4Java.<init>(Energy4Java.java:51)
at org.qi4j.bootstrap.Energy4Java.<init>(Energy4Java.java:44)
...

在 karaf 控制台上,打印以下内容:

Qi4j Runtime jar is not present in the classpath.

我在这样的激活器方法中引导 qi4j(apache scr 组件):

@Activate
public void activate() {

    try {
        // Bootstrap Qi4j Runtime
        // Create a Qi4j Runtime
        qi4j = new Energy4Java();
        ...
    } ...

在 pom.xml 中我定义了导入:

<Import-Package>
    org.qi4j.runtime,
    org.qi4j.runtime.*,
    org.qi4j.api.activation,
    org.qi4j.bootstrap,
    org.slf4j, 
    *
</Import-Package>
<DynamicImport-Package>*</DynamicImport-Package>

所有包都解析,包括我在 servicemix 5.3.0 中部署的运行时以及所需的依赖:

features:install scr
osgi:install wrap:mvn:org.codeartisans/org.json/20130213
osgi:install mvn:org.ow2.asm/asm-all/4.1
osgi:install mvn:org.qi4j.core/org.qi4j.core.api/2.0
osgi:install mvn:org.qi4j.core/org.qi4j.core.functional/2.0
osgi:install mvn:org.qi4j.core/org.qi4j.core.io/2.0
osgi:install mvn:org.qi4j.core/org.qi4j.core.spi/2.0
osgi:install mvn:org.qi4j.core/org.qi4j.core.bootstrap/2.0
osgi:install mvn:org.qi4j.core/org.qi4j.core.runtime/2.0

有什么诀窍?

【问题讨论】:

标签: osgi apache-servicemix apache-zest


【解决方案1】:

可能您还没有启动捆绑包。 osgi:install 会安装捆绑包,但不会启动它们。请试试这个

features:install scr
osgi:install -s wrap:mvn:org.codeartisans/org.json/20130213
osgi:install -s mvn:org.ow2.asm/asm-all/4.1
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.api/2.0
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.functional/2.0
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.io/2.0
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.spi/2.0
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.bootstrap/2.0
osgi:install -s mvn:org.qi4j.core/org.qi4j.core.runtime/2.0

【讨论】:

  • 2.0 版也没有通过对 OSGi 的适当验证,因为当时没有核心开发人员从事 OSGi 工作。例如,不需要 joda-time 似乎很奇怪,因此我不会打赌它会起作用。
【解决方案2】:

其实我调试了runtime创建过程,发现bootstrap bundle中的RuntimeFactory试图加载org.qi4j.runtime.Qi4jRuntimeImpl。显然,这来自 org.q14j.runtime 包,它不是由引导程序包导入的。

我为主机 org.qi4j.core.bootstrap;bundle-version=2.0.0 创建了一个片段包来修复导入。

这完成了工作。

【讨论】:

  • 当然如果引导包直接导入org.q14j.runtime会更干净。
  • 在使用 vanilla Energy4Java 类时仍然存在 ClassLoader 问题。这是由于使用了currentThread.getClassLoader()。我通过在引导阶段将 classLoader 设置为 bundleClassLoader 来解决它。
  • 如果您还在使用 Qi4j/Polygene,请直接联系我。 niclas@hedhman.org
猜你喜欢
  • 2017-05-12
  • 2012-10-11
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多