繁体   English   中英

JBoss EAP 6上的OSGi

[英]OSGi on JBoss EAP 6

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

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

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

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

另外,我不确定如何配置我的耳朵文件以“查看”捆绑包。 我是否需要在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代码实际上看不到捆绑软件的代码,它将抛出ClassNotFoundException。

如果我将所有捆绑软件移到ear文件内的lib文件夹中,那么我的EJB代码将找到这些类,但是不会发生OSGi魔术,因此这些jar不会互相找到。

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

更新3

我已经将所有捆绑META-INF/application.xml作为“ java”模块添加到META-INF/application.xml文件中,但是这样做有些奇怪。

MyEJB具有直接的代码依赖性,可以说bundle1不能依赖于任何其他bundle。 现在bundle1反过来对其他bundle具有代码依赖性,而那些bundle对其他bundle等。

有了我的application.xml中的jars,它不再引发异常,它无法在bundle1找到该类(是的!)。。。现在我从bundle2获得了ClassNotFoundException,该异常由bundle1引用...

JBoss OSGi 当前没有维护者 EAP 6不支持此功能,WildFly AS不再包含它。 我建议您找到一种不同的方式来运行OSGi。 无论是白羊座,双子座还是在EAR中运行完整的OSGi容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM