OSGi on JBoss EAP 6



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

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

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

我已经将捆绑包移到"bundles"目录中的自定义文件夹中,但不确定这是否是放置它们的正确位置。

此外,我不知道如何配置我的ear文件来"查看"捆绑包。我需要向jboss-app.xmljboss-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>

在第一次尝试时,我得到了这样的警告日志:

[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的角度来看,基本上一切都很好,但我的实际应用程序仍然看不到库。耳朵看起来像这样:

  • META-INF
    • application.xml
  • mybundle1.jar
  • mybundle2.jar
  • mybundle3.jar
  • MyEJB.jar

application.xml尽职尽责地包含MyEJB.jar的ejb条目,但是ejb代码实际上看不到bundle的代码,它会抛出ClassNotFoundException。

如果我将所有的bundle移到ear文件中的lib文件夹中,我的EJB代码将找到这些类,但没有OSGi魔法发生,因此jar不会找到彼此。

因此,现在我正试图弄清楚如何让OSGi模块加载对我的EJB可见。

更新3

我已经将所有捆绑包作为"java"模块添加到META-INF/application.xml文件中,但这会产生一些奇怪的情况。

MyEJB有一个直接的代码依赖关系,比如bundle1,但与任何其他捆绑包都没有。现在bundle1反过来又对其他捆绑包具有代码依赖性,并且这些捆绑包对其他捆绑等具有代码依赖。

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

JBossOSGi目前没有维护人员。EAP 6不支持它,也不再是WildFly AS的一部分。我建议你找到一种不同的方式来运行OSGi。无论是Aries、Gemini还是在EAR中运行一个完整的OSGi容器。

相关内容

  • 没有找到相关文章

最新更新