我有一个现有的ear应用程序,它在目前没有配置OSGi的jboss服务器上运行,不以任何方式使用OSGi。
现在,我需要插入许多使用OSGi(声明式!)进行服务设置的外部库,因此我需要在配置中启用OSGi容器,并以某种方式让我的ear应用程序知道它们。
为了启用OSGi容器,我复制了示例配置文件的相关部分(或者我希望如此):standalone-osgi-only.xml
(包括记录器),但目前在加载服务器时没有看到额外的输出(子系统设置为渴望)。
我已经将捆绑包移到"bundles"目录中的自定义文件夹中,但不确定这是否是放置它们的正确位置。
此外,我不知道如何配置我的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>
在第一次尝试时,我得到了这样的警告日志:
[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容器。