[英]OSGi on JBoss EAP 6
我有一个现有的ear应用程序,该应用程序在当前未配置OSGi的jboss服务器上以任何方式使用OSGi。
现在,我需要插入许多使用OSGi的外部库(以声明方式!)来进行服务设置,因此我需要在配置中启用OSGi容器,并以某种方式使我的耳部应用程序意识到它们。
为了启用OSGi容器,我复制了示例配置文件的相关部分(或希望如此): standalone-osgi-only.xml
(包括logger),但当前在加载服务器(设置了子系统)时看不到其他输出渴望)。
我已经将捆绑软件移到“捆绑软件”目录中的自定义文件夹中,但是不确定这是否是它们的正确位置。
另外,我不确定如何配置我的耳朵文件以“查看”捆绑包。 我是否需要在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>
在第一次尝试中,我得到了如下警告日志:
[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忠实地包含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.