【发布时间】:2014-11-12 08:21:28
【问题描述】:
我有一个现有的 ear 应用程序,它不以任何方式使用 OSGi,运行在当前没有配置 OSGi 的 jboss 服务器上。
现在我需要插入一些使用 OSGi(以声明方式!)进行服务设置的外部库,因此我需要在配置中启用 OSGi 容器并以某种方式让我的 ear 应用程序知道它们。
为了启用 OSGi 容器,我复制了示例配置文件的相关(或者我希望如此)部分:standalone-osgi-only.xml(包括记录器)但目前我在加载服务器时没有看到额外的输出(子系统设置为渴望)。
我已将捆绑包移动到“捆绑包”目录中的自定义文件夹中,但不确定这是否适合它们。
此外,我不确定如何配置我的 ear 文件以“查看”捆绑包。我是否需要在jboss-app.xml 或jboss-deployment-structure.xml 中添加一些内容,或者它可以简单地查看所有 OSGi 捆绑包吗?
更新
ear 文件中的代码实际上不需要访问任何 OSGi 服务,它需要访问其中一个库中的特定类,我们称之为“MyClass”。所以ear文件中的代码是这样的:
MyClass myClass = new MyClass();
myClass.doSomething();
然而,MyClass 类使用大量 OSGi 管理的服务来完成 doSomething() 中的任务。
我已经在测试 OSGi 环境中加载了所有库,并且测试运行正常。
更新 2
好的,我已经成功在 jboss 服务器上启用了 OSGi,方法是在standalone.xml 中添加以下内容:
<extensions>
<extension module="org.jboss.as.configadmin"/>
<extension module="org.jboss.as.osgi"/>
</extensions>
和
<subsystem xmlns="urn:jboss:domain:configadmin:1.0">
<configuration pid="org.apache.felix.webconsole.internal.servlet.OsgiManager">
<property name="manager.root" value="jboss-osgi"/>
</configuration>
</subsystem>
<subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="eager">
<properties>
<property name="org.jboss.osgi.system.modules.extra">
org.apache.log4j
</property>
<property name="org.osgi.framework.startlevel.beginning">
1
</property>
<property name="org.osgi.framework.system.packages.extra">
org.apache.log4j;version=1.2
</property>
</properties>
<capabilities>
<capability name="javax.servlet.api:v25"/>
<capability name="javax.transaction.api"/>
<capability name="javax.xml.bind.api"/>
<capability name="javax.validation.api2"/>
<capability name="org.apache.felix.log" startlevel="1"/>
<capability name="org.jboss.osgi.logging" startlevel="1"/>
<capability name="org.apache.felix.configadmin" startlevel="1"/>
<capability name="org.jboss.as.osgi.configadmin" startlevel="1"/>
</capabilities>
</subsystem>
在第一次尝试时,我得到了这样的 WARN 日志:
[org.jboss.as.osgi] (MSC service thread 1-6) JBAS011910: Cannot resolve requirements:
[XPackageRequirement[atts={osgi.wiring.package=javax.xml.bind.annotation},
[mybundle:1.0.0]]]
即使这些是警告,它们也会阻止应用程序启动,为了解决这个问题,我通过调整 OSGi 子系统的“功能”位添加了必要的“根”依赖项(可以这么说)。我添加了模块 javax.xml.bind.api,其中包含框架需要的所有 JAXB 内容,并且我安装了一个新模块 javax.validation.api2,它基本上包含版本 1.1(框架需要)而不是提供的 -默认版本为 1.0。
在我的 application.ear 文件中,我已将包含 OSGi 包的 10 个左右的 jar 添加到根文件夹中。我得到了耳内每个罐子的以下日志:org.jboss.osgi.framework] (MSC service thread 1-3) JBOSGI011001: Bundle installed: mybundle
所以从 OSGi 的角度来看,基本上一切看起来都不错但是我的实际应用程序仍然看不到这些库。耳朵是这样的:
- 元信息
- application.xml
- mybundle1.jar
- mybundle2.jar
- mybundle3.jar
- MyEJB.jar
application.xml 忠实地包含了 MyEJB.jar 的 ejb 条目,但是 EJB 代码实际上看不到包的代码,它会抛出 ClassNotFoundException。
如果我将所有捆绑包移动到 ear 文件内的 lib 文件夹,我的 EJB 代码将找到这些类,但不会发生 OSGi 魔法,因此 jar 不会相互找到。
所以现在我想弄清楚如何让 OSGi 模块加载并且对我的 EJB 可见。
更新 3
我已将所有捆绑包作为“java”模块添加到 META-INF/application.xml 文件中,但是这样做有些奇怪。
包MyEJB 具有直接的代码依赖关系,即bundle1,但不 对任何其他捆绑包。现在bundle1 又对其他捆绑包具有代码依赖性,并且这些捆绑包对其他捆绑包等具有依赖性。
使用我的 application.xml 中的 jar,它不再引发无法在 bundle1 中找到类的异常(耶!)buuut...现在我从 bundle2 得到一个 ClassNotFoundException,它被引用bundle1...
【问题讨论】:
-
这里涉及到很多东西。您是否正在导出您引用的服务?您正在注册您的服务吗?您是否正确注册了它们?。
-
我已经更新了原来的问题。
-
“这里涉及到很多事情”...你可以再说一遍。这与其说是一个 SO 问题,不如说是一个咨询项目。
-
@NeilBartlett 我试图彻底记录我已经采取的步骤。但最终还是归结为一个简单的问题:如何让“普通 EE”项目在 JBoss 环境中使用 OSGi 捆绑包。
-
@nablex 够公平的。我想获得答案取决于找到熟悉这两种技术的人。