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 包