Как я могу настроить модуль и имя приложения для поиска JNDI

В EJB 3.1 поиск JNDI можно выполнять с разными именами поиска:

java:global[/<app-name>]/<module-name>/<bean-name>!<fully-qualifiedbean interface-name>           
java:global[/<app-name>]/<module-name>/<bean-name> 
java:app/<module-name>/<bean-name>!<fully-qualified-bean-interface-name> 
java:app/<module-name>/<bean-name> 
java:module/<bean-name>!<fully-qualified-bean-interface-name> 
java:module/<bean-name>

В моем проекте JavaEE 6 (с Maven 2, Netbeans 6 и Glassfish v3) имя приложения — X-Snapshot.ear, а EJB-модуль — Y-Snapshot.jar. Как я могу настроить этот проект maven для использования другого имени приложения и модуля? Я не хочу менять все поиски JNDI, когда эти имена меняются!! Так можно ли настроить имена приложений и модулей для JNDI LookUps?


person Michael W.    schedule 07.08.2010    source источник


Ответы (2)


Наивный подход

Плагин Maven EAR позволяет настраивать модуль Имя файла, и вы можете установить окончательное имя или EAR, используя project.build.finalName.

Гораздо лучший подход

Переопределите <application-name> и <module-name> в application.xml и ejb-jar.xml соответственно. Цитируя имя Portable Global JNDI в EJB 3.1:

В дополнение к приведенному выше имени, если EJB предоставляет только одно клиентское представление (то есть он реализует только один интерфейс или представление без интерфейса), контейнер также обязан сопоставить компонент с

java:global/[<application-name>]/<module-name>/<bean-name>

Где

  1. <aplication-name> по умолчанию соответствует имени пакета (.ear имени файла) без расширения пакета. Это можно переопределить в application.xml. Кроме того, <application-name> применимо только в том случае, если bean-компонент упакован внутри файла .ear.
  2. <module-name> по умолчанию соответствует имени пакета (.war или .jar) без расширения пакета. Опять же, это можно переопределить в ejb-jar.xml.
  3. <bean-name> по умолчанию является неполным именем класса компонента. Однако, если @Stateful или @Stateless или @Singleton использует атрибут name, то указанное там значение будет использоваться как имя компонента.
person Pascal Thivent    schedule 07.08.2010
comment
Спасибо, Паскаль. Прежде чем я прочитал ваш пост, я попробовал кое-что еще, что сработало: в application.xml ушного модуля вы можете использовать ‹application-name›abc-app‹/application-name›. В файле ejb-jar.xml модуля ejb вы можете использовать ‹имя-модуля›abc-module‹/имя-модуля›. Ваше предложение также может сработать (я не пробовал). Кстати (для тех, кто читает этот пост): хорошие ссылки, касающиеся JNDI: blogs.sun.com /MaheshKannan/entry/portable_global_jndi_names blogs.sun.com/kensaks/entry/portable_global_jndi_names blogs.sun.com/kensaks/entry/ - person Michael W.; 08.08.2010
comment
@Michael: Гораздо лучше переопределить эти имена в дескрипторе развертывания. Я обновил свой ответ. - person Pascal Thivent; 08.08.2010
comment
@PascalThivent: я добавил теги ‹application-name› в application.xml и развернул его на сервере Glassfish (v4), но он игнорируется. Это ошибка или у вас есть идеи, почему это может произойти? - person bchetty; 10.04.2015
comment
@bchetty: Это вполне может быть ошибкой, у меня та же проблема - в настоящее время проверяю источники Glassfish, чтобы выяснить... - person Benjamin Seiller; 19.06.2015

Имя приложения и имена модулей можно найти во время выполнения через JNDI:

@Resource(lookup = "java:app/AppName")
private String appName;

@Resource(lookup = "java:module/ModuleName")
private String moduleName;

Хотя вы можете настроить имя приложения и имя модуля в дескрипторе развертывания приложения как описано, эти имена по-прежнему могут быть переопределены во время развертывания (согласно спецификация Java EE, как указано ниже), поэтому лучше не задавать эти значения жестко в коде приложения.

EE.8.5.2 Развертывание приложения Java EE и EE.8.5.1 Развертывание автономного модуля Java EE

Инструмент развертывания должен гарантировать уникальность имени приложения в экземпляре сервера приложений. Если имя не уникально, средство развертывания может автоматически выбрать уникальное имя или позволить разработчику выбрать уникальное имя.

EE.8.1.1 Создание компонента

Если и только если имя не уникально (например, потому что два имени идентичны после удаления разных расширений имен файлов), инструмент развертывания может выбрать новые уникальные имена для любого из конфликтующих модулей; имена модулей, которые не конфликтуют, не должны изменяться. Алгоритм выбора уникальных имен в таком случае зависит от продукта.

person shelley    schedule 15.08.2011
comment
Я развертываю ухо с ejb и веб-модулем, как я могу таким образом получить имя модуля ejb? - person phanhongphucit; 27.03.2015