У меня есть существующее приложение для ушей, которое не использует OSGi каким-либо образом на сервере jboss, который в настоящее время не настроен для OSGi.OSGi на JBoss EAP 6
Теперь мне нужно подключить несколько внешних библиотек, которые используют OSGi (декларативно!) Для настройки сервиса, поэтому мне нужно включить контейнер OSGi в конфигурации и как-то сделать из них приложение для ушей.
Чтобы включить контейнер OSGi, я скопировал соответствующие (или так надеюсь) части примерного файла конфигурации: standalone-osgi-only.xml
(включая регистратор), но в настоящее время я не вижу дополнительного вывода при загрузке сервера (подсистема настроена на ожидание).
Я переместил связки в пользовательскую папку в каталоге «bundles», но не уверен, что это подходящее место для них.
Кроме того, я не уверен, как настроить мой файл уха, чтобы «видеть» пакеты. Нужно ли что-то добавить к jboss-app.xml
или jboss-deployment-structure.xml
или просто увидеть все пакеты OSGi?
UPDATE
код в файле ухо на самом деле не нуждается в доступе к любому из OSGi услуг, ему нужен доступ к определенному классу, который находится в одной из библиотек, давайте назовем это «MyClass» , Таким образом, код в файле уха делает:
MyClass myClass = new MyClass();
myClass.doSomething();
Класс MyClass однако использует тонну OSGi-управляемых услуг для выполнения этой задачи в DoSomething().
Я загрузил все библиотеки в тестовую среду OSGi, и тест проходит нормально.
UPDATE 2
Хорошо, я успешно активировали OSGi на сервере JBoss, добавив следующее standalone.xml:
<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 я добавил 10 корневых пакетов, содержащих пакеты OSGi, в корневую папку. Я получаю следующий журнал для каждой баночки внутри уха: 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
Приложение.xml содержит в себе запись ejb для MyEJB.jar, однако код EJB не может видеть код пакетов, он будет генерировать ClassNotFoundException.
Если я переместил все мои пакеты в папку lib
внутри файла уха, мой EJB-код найдет классы, но магия OSGi не произойдет, поэтому банки не найдут друг друга.
Итак, теперь я пытаюсь выяснить, как загружать модули OSGi и, видимые для моего EJB.
UPDATE 3
Я добавил все пакеты в файл META-INF/application.xml
как «Java» модулей, однако это делает что-то странное.
MyEJB
Пакет имеет прямую зависимость кода сказать bundle1
но не в других пучках. Теперь bundle1
в свою очередь, имеет код зависимость для других пучков и эти пучки пока другие связки и т.д.
С банок в моем application.xml, она больше не бросает исключение, которое не может найти класс в bundle1
(яй !) buuut ... теперь я получаю ClassNotFoundException от bundle2
, на который ссылаются bundle1
...
Здесь есть много вещей. Вы экспортируете сервисы, на которые вы ссылаетесь ?. Вы регистрируете свои услуги? Вы регистрируете их правильно ?. – TheLostMind
Я обновил исходный вопрос. – nablex
«Здесь много вещей» ... вы можете это повторить. Это не столько вопрос SO, сколько консалтинговое взаимодействие. –