【问题标题】:OSGi on JBoss EAP 6JBoss EAP 6 上的 OSGi
【发布时间】:2014-11-12 08:21:28
【问题描述】:

我有一个现有的 ear 应用程序,它不以任何方式使用 OSGi,运行在当前没有配置 OSGi 的 jboss 服务器上。

现在我需要插入一些使用 OSGi(以声明方式!)进行服务设置的外部库,因此我需要在配置中启用 OSGi 容器并以某种方式让我的 ear 应用程序知道它们。

为了启用 OSGi 容器,我复制了示例配置文件的相关(或者我希望如此)部分:standalone-osgi-only.xml(包括记录器)但目前我在加载服务器时没有看到额外的输出(子系统设置为渴望)。

我已将捆绑包移动到“捆绑包”目录中的自定义文件夹中,但不确定这是否适合它们。

此外,我不确定如何配置我的 ear 文件以“查看”捆绑包。我是否需要在jboss-app.xmljboss-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 够公平的。我想获得答案取决于找到熟悉这两种技术的人。

标签: java jboss osgi wildfly


【解决方案1】:

JBoss OSGi has currently no maintainer。它在 EAP 6 中不受支持,并且不再是 WildFly AS 的一部分。我建议您找到一种不同的方式来运行 OSGi。无论是 Aries、Gemini 还是在您的 EAR 中运行完整的 OSGi 容器。

【讨论】:

  • 嗯,这很糟糕。这些框架目前支持 OSGi 或 SPI。不再支持 OSGi 并且模块系统中的 SPI 已死(afaik),那么 jboss 等价于服务是什么?我可以添加一些配置文件来做类似 OSGi 的服务吗?
  • 我不知道您在这种情况下对 SPI 的意思。我会尽量避免依赖任何 JBoss 内部 APi,因为它们都不受支持并且可能会发生变化。
  • SPI 如docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html。这些框架被设计为(目前)以三种不同的方式工作:SPI、OSGi 或手动配置。如果 jboss 有一个可以添加配置文件的自定义服务系统,我也很乐意将它们添加到框架中。
  • JBoss 有它自己的Modular Service Container 但我认为你不想使用它。 AFAIK 它是内部 API,甚至没有导出到部署中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2019-07-16
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多