【问题标题】:OSGi bundle has name unknown_0.0.0OSGi 包的名称为 unknown_0.0.0
【发布时间】:2016-02-03 18:08:04
【问题描述】:

我已经通过 Apache Felix Maven Bundle Plugin 创建了 OSGi 包。输出 jar 文件看起来不错,MANIFEST.MF 如下:

Manifest-Version: 1.0
Export-Package: cz.bach.entities.ui.extensions;uses:="org.osgi.framewo
rk,cz.bach.entities.ui.extensions.output,org.slf4j,cz.bach.dataframe2
.domain,com.vaadin.ui,cz.bach.entities.ui.commons,cz.bach.entities.ui
.actions,com.vaadin.server,org.springframework.beans.factory.annotati
on,cz.bach.entities.ui.lang,cz.bach.entities.ui.output,org.aspectj.la
ng,org.springframework.transaction.aspectj,org.aspectj.lang.reflect,o
rg.springframework.transaction.annotation,org.aspectj.runtime.reflect
,org.springframework.beans.factory.aspectj,org.springframework.beans,
org.springframework.context,org.springframework.beans.factory.config,
com.vaadin.event,org.apache.log4j,org.osgi.framework.launch"
Ignore-Package: cz.bach.entities.ui.extensions
Bundle-ActivationPolicy: lazy
Built-By: firzen
Tool: Bnd-0.0.357
Bundle-Name: extensions
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.6.0_45
Bundle-Version: 0.0.1.SNAPSHOT
Bnd-LastModified: 1446557486350
Bundle-Activator: cz.bach.entities.ui.extensions.Activator
Bundle-ManifestVersion: 2
Bundle-SymbolicName: isai-extensions
Import-Package: com.vaadin.event;resolution:=optional;version="7.5",co
m.vaadin.server;resolution:=optional;version="7.5",com.vaadin.ui;reso
lution:=optional;version="7.5",cz.bach.dataframe2.domain;resolution:=
optional,cz.bach.entities.ui.actions;resolution:=optional,cz.bach.ent
ities.ui.commons;resolution:=optional,cz.bach.entities.ui.extensions.
output;resolution:=optional,cz.bach.entities.ui.lang;resolution:=opti
onal,cz.bach.entities.ui.output;resolution:=optional,org.apache.log4j
;resolution:=optional,org.aspectj.lang;resolution:=optional,org.aspec
tj.lang.reflect;resolution:=optional,org.aspectj.runtime.reflect;reso
lution:=optional,org.osgi.framework;resolution:=optional;version="1.3
",org.osgi.framework.launch;resolution:=optional;version="1.1",org.sl
f4j;resolution:=optional;version="1.7",org.springframework.beans;reso
lution:=optional;version="3.1",org.springframework.beans.factory.anno
tation;resolution:=optional;version="3.1",org.springframework.beans.f
actory.aspectj;resolution:=optional;version="3.1",org.springframework
.beans.factory.config;resolution:=optional;version="3.1",org.springfr
amework.context;resolution:=optional;version="3.1",org.springframewor
k.transaction.annotation;resolution:=optional;version="3.1",org.sprin
gframework.transaction.aspectj;resolution:=optional;version="3.1"

但是当我在我的项目中通过这段代码加载这个 jar 文件时..

public void installPackage(File f) throws BundleException  {
    Bundle b = ctx.installBundle("file:" + f.getPath());
    System.out.println("starting bundle: " + b + ", location: " + f.getPath());
    b.start();
}

.. 输出是:

starting bundle: unknown_0.0.0 [3], location: /tmp/isai-extensions.jar

这意味着 bundle 的符号名称是 null,尽管它是在 MANIFEST.MF 中通过以下行指定的:Bundle-SymbolicName: isai-extensions。此外,当我调用b.start() 时,不会引发异常。这是很奇怪的行为..如何正确设置符号名称?

提前致谢!

【问题讨论】:

    标签: java maven osgi


    【解决方案1】:

    您可以拨打Bundle.getSymbolicName

    在您的示例代码中,您调用的是Bundle.toString。 OSGi 规范没有准确定义这个方法应该返回什么,但我有点惊讶它返回“未知”。

    【讨论】:

    • 这出乎意料。我怀疑捆绑包没有真正正确安装。您绝对确定您的代码不会引发异常吗?你可以用try{ .. } catch (Throwable) 包裹它吗?
    • 一件看起来很奇怪的事情是您将文件转换为 URL 的方式。仅以 file: 为前缀是不安全的,如果文件路径是相对的或在 Windows 上运行,它将失败。您应该改用f.toURI().toString()。此外,当您报告捆绑包的位置时,您应该使用b.getLocation()
    • 感谢您的建议。最后我用完全不同的方式解决了这个问题——看看我的解决方案。
    【解决方案2】:

    我已通过删除 /tmp/org.eclipse.osgi 文件夹(在 GNU/Linux 机器上)解决了这个问题。在这一步之后,我的包开始工作了。

    【讨论】:

    • 我不太清楚——你是这里的 OSGi 大师 :-) 但是在提到的文件夹中,我发现了一些显然代表包的文件夹,并且可能我的包在我重新部署时没有正确更新它。
    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2012-03-23
    相关资源
    最近更新 更多