Как использовать класс global-module для ejb home / remote? - PullRequest
0 голосов
/ 01 февраля 2019

Перенос существующего проекта в maven и wildfly, и ему пришлось перемещать некоторые файлы, создавая следующую ситуацию.

  • core.jar
  • ejb1.jar
  • ejb2.jar

. При этом ejb-jar.xml для ejb1.jar имеет следующее:

<ejb-jar>
  <enterprise-beans>
    <session id="Value">
      ..
      <home>path.to.ejb1Home</home>
      <remote>path.to.ejb1</remote>
      ...

Классы, на которые ссылаются теги home и remote, переместились внутрьcore.jar

Между тем ejb2.jar зависит от других частей core.jar.

То, что выглядело как простое решение, это создать глобальный модуль и поместить в него core.jar, создавсоответствующий файл module.xml и запись в standalone.sh, чтобы сделать его доступным для всех развертываний.

module.xml

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.0" name="path.to"> 
  <resources> 
    <resource-root path="core-1.0.jar"/>
  </resources> 
  <dependencies> 
  </dependencies> 
</module>

При этой настройке ejb2.jar развертывается, как ожидается, но ejb1.jar выдает следующую ошибку:

Caused by: java.lang.NoClassDefFoundError: Failed to link path.to.ejb1 
    (Module "path.to" from local module loader @4c40b76e (finder: local 
     module finder @2ea6137 (roots: /opt/wildfly/modules, 
     /opt/wildfly/modules/system/layers/base))): javax/ejb/EJBObject

1 Ответ

0 голосов
/ 13 февраля 2019

Вы должны тщательно продумать ваше требование.Обычно вам не нужно предоставлять общие ресурсы, особенно интерфейсы приложений, как модуль, особенно как глобальный модуль.Выберите правильное решение для ваших требований, а не решения, которые на первый взгляд кажутся простыми, не зная последствий.

Я бы порекомендовал эти возможности в указанном порядке (см. Класс загрузки в документации Wildfly для получения дополнительной информации):

  1. Пересмотрите ваши требования к различным EAR.Предоставьте core jar как библиотеку вместе с EAR.
  2. Даже с несколькими EAR: укажите core.jar в качестве библиотеки.Это не избыточность, это просто разделение.
  3. Не используйте глобальный модуль.Просто установите свой пользовательский модуль.Укажите файл jboss-deployment-structure.xml, добавив этот модуль в качестве дополнительной зависимости.Если модуль содержит аннотированные классы или интерфейсы, которые следует учитывать при развертывании, задайте атрибут annotations=true с конфигурацией зависимостей модуля.
  4. Добавьте глобальный модуль в файл конфигурации.Возможно, вы даже можете использовать свойство `annotations ', но это то, чего я не знаю, и я не проверял.

Пример для файла jboss-deployment-structure.xml:

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
      <deployment>
        <dependencies>
          <module name="my.custom.module" export="true" annotations="true"/>
        </dependencies>
      </deployment>
    </jboss-deployment-structure>

РЕДАКТИРОВАТЬ:

При установке модулей не забудьтеобеспечить переходные зависимости модулей от других модулей, от которых зависит ваш собственный модуль.Для этого используйте ваш файл module.xml.В вашем случае вам, вероятно, нужна хотя бы зависимость от модуля javax.ejb.api.

...