java - JBoss EAP 6 上的 OSGi

标签 java jboss osgi wildfly

我有一个现有的 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

好的,通过将以下内容添加到standalone.xml,我已经成功地在jboss服务器上启用了OSGi:
<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 添加到根文件夹中。对于耳朵内的每个 jar ,我得到以下日志:org.jboss.osgi.framework] (MSC service thread 1-3) JBOSGI011001: Bundle installed: mybundle
所以从 OSGi 的角度来看,基本上一切看起来都不错 但是 我的实际应用程序仍然看不到库。耳朵长这样:
  • 元信息
  • 应用程序.xml
  • mybundle1.jar
  • mybundle2.jar
  • mybundle3.jar
  • MyEJB.jar

  • application.xml 忠实地包含了 MyEJB.jar 的 ejb 条目,但是 EJB 代码实际上看不到包的代码,它会抛出 ClassNotFoundException。

    如果我将所有捆绑包移至 lib在 ear 文件中的文件夹中,我的 EJB 代码会找到这些类,但是没有 OSGi 魔法发生,所以 jar 不会相互找到。

    所以现在我想弄清楚如何加载 OSGi 模块 对我的 EJB 可见。

    更新 3

    我已将所有捆绑包添加到 META-INF/application.xml文件作为“java”模块,但这会做一些奇怪的事情。

    MyEJB有一个直接的代码依赖说 bundle1但是 不是 到任何其他捆绑包。现在bundle1反过来,代码依赖于其他捆绑包,而这些捆绑包又依赖于其他捆绑包等。

    使用我的 application.xml 中的 jar,它不再抛出无法在 bundle1 中找到类的异常。 (耶!)buuut...现在我从 bundle2 得到一个 ClassNotFoundException由 bundle1 引用...

    最佳答案

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

    关于java - JBoss EAP 6 上的 OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882254/

    相关文章:

    jboss - Wildfly 和过程 Controller

    java - 无法在 org.kie :kie-api:jar:6. 4.0.Final 处收集依赖项:

    java - JBOSS中的Maven项目,如何更改类加载器的优先级?

    java - EclipseLink MOXy OSGi bundle 的问题

    java - 如何在 OSGI 的 Activator 类中使用 Eclipse Interface Command Provider

    java - 在 Java 中查找两个 ArrayList 之间的不同元素

    java - 如何使 Eclipse 对齐? : ternary operator?

    java - Spring Integration 应用程序未使用 ActiveMQ 队列

    java - 使用java 4.0版本编译

    java - 如何在 OSGI 框架的运行时动态加载 Java 类?