OSGi:无法在 Apache Karaf 中找到 UserAdmin

Posted

技术标签:

【中文标题】OSGi:无法在 Apache Karaf 中找到 UserAdmin【英文标题】:OSGi: unable to find UserAdmin in Apache Karaf 【发布时间】:2014-03-11 00:07:10 【问题描述】:

我正在尝试在 Karaf 2.3.3 中安装并启动 OSGi UserAdmin 界面的 Apache Felix 实现。

karaf@root> install mvn:org.apache.felix/org.apache.felix.useradmin/1.0.3

但是,捆绑包永远不会得到解决,我在启动时收到以下错误:

Unable to start bundle 89: Activator start error in bundle org.apache.felix.useradmin [89].
[...]
Caused by: java.lang.NoClassDefFoundError: org.osgi.service.useradmin.UserAdminListener
    at org.apache.felix.useradmin.osgi.UserAdminListenerListHelper.class$(UserAdminListenerListHelper.java:38)
    at org.apache.felix.useradmin.osgi.UserAdminListenerListHelper.<init>(UserAdminListenerListHelper.java:38)
    at org.apache.felix.useradmin.osgi.Activator.createServiceContext(Activator.java:68)
    at org.apache.felix.useradmin.osgi.Activator.start(Activator.java:37)
    at org.apache.felix.framework.util.SecureAction$Actions.run(SecureAction.java:1605)
    at java.security.AccessController.doPrivileged(Native Method)[:1.7.0_51]
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:636)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
    ... 16 more

正如我在this thread from the Karaf mailing list 中读到的,Karaf 已经嵌入了 OSGi Compendium API,但默认情况下不会导出所有包。我更改了config.properties 文件以显式导出UserAdmin 包:

org.osgi.framework.system.packages= \
  [...]
  org.osgi.service.permissionadmin;uses:="org.osgi.framework";version="1.1", \
  org.osgi.service.useradmin;uses:="org.osgi.framework";version="1.1", \
  [...]

org.osgi.service.useradmin 包似乎是由 Karaf 导出的,正如我在运行 packages:exports 时看到的那样。


在我从配置文件中删除该行并按照in this other thread 的建议部署 OSGi Compendium API 包之前,我一直收到错误消息。

但是,嵌入完整的 Compendium API 对我来说似乎有些矫枉过正(尽管我可能错了)。我现在有 4 个包导出 UserAdmin 包:

karaf@root> packages:exports | grep useradmin
     0 # org.osgi.service.useradmin; version=1.1.0
    20 org.osgi.jmx.service.useradmin; version=1.1.0
    82 org.osgi.service.useradmin; version=1.1.0     --> OSGi Compendium osgi.cmpn (5.0.0.201305092017)
    89 org.apache.felix.useradmin; version=1.0.0     --> Apache Felix User Admin Service (1.0.3)

您知道实现这一目标的更好/更简单的方法吗?

【问题讨论】:

【参考方案1】:
karaf@root> packages:exports | grep useradmin
 0 # org.osgi.service.useradmin; version=1.1.0
20 org.osgi.jmx.service.useradmin; version=1.1.0
82 org.osgi.service.useradmin; version=1.1.0     --> OSGi Compendium osgi.cmpn (5.0.0.201305092017)
89 org.apache.felix.useradmin; version=1.0.0     --> Apache Felix User Admin Service (1.0.3)

您列出的第一个捆绑包 0,即导出用户管理员,我怀疑实际上并没有导出任何内容。第二个是导出一个完全不相关的包。第三个是导出实际的 useradmin API。第四个是导出 apache felix 特定的类。

Karaf 实际上在标准下载的任何地方都不包含 useradmin 包。

apache-karaf-2.3.3 sartrip -> gfind -iname \*jar | parallel unzip -l   | grep userad
    0  01-23-13 14:59   org/osgi/jmx/service/useradmin/
 4462  01-23-13 14:59   org/osgi/jmx/service/useradmin/UserAdminMBean.class
  822  01-23-13 14:59   org/osgi/jmx/service/useradmin/packageinfo
    0  02-08-13 11:24   org/apache/aries/jmx/useradmin/
12187  02-08-13 11:24   org/apache/aries/jmx/useradmin/UserAdmin.class
 1828  02-08-13 11:24   org/apache/aries/jmx/useradmin/UserAdminMBeanHandler.class

这意味着您必须安装包含 useradmin API 的包,方法是安装 OSGI 概要 API 包或构建您自己的 JAR,其中仅包含您想要的部分 (org.osgi.service.useradmin)。

编辑:

我还要指出,尚未发布的 apache felix useradmin 版本将包含 org.osgi.service.useradmin(应该如此!)这意味着最终您对纲要 API jar 的依赖将会消失。 https://github.com/apache/felix/blob/trunk/useradmin/useradmin/pom.xml#L81

【讨论】:

我意识到第二次导出与 UserAdmin 服务无关,只是忘记将其删除:感谢您指出!我期待使用带有嵌入式 API 的新 Felix UserAdmin!

以上是关于OSGi:无法在 Apache Karaf 中找到 UserAdmin的主要内容,如果未能解决你的问题,请参考以下文章

OSGi 容器 - Equinox 与 Apache Karaf 中的 Apache Felix

如何使用 Apache Karaf/OSGi 构建桌面应用程序?

OSGi:Apache Felix 和 Apache Karaf 有啥区别?

需要为 Apache karaf 2.2.8 工作的 Apache POI 3.8 osgi 包

无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR

如何使用 maven 项目轻松部署到 Karaf Osgi 容器