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

В EJB 3.1 JNDI Поиск может выполняться с помощью разных Lookup-Names:

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 Lookups, когда эти имена меняются! Так можно ли конфигурировать имена приложений и модулей для JNDI LookUps?

Ответы

Ответ 1

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

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

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

Отмените <application-name> и <module-name> в application.xml и ejb-jar.xml соответственно. Цитирование Переносное глобальное имя JNDI в EJB 3.1:

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

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

Где

  • <aplication-name> по умолчанию присваивается имя пакета (.ear имя файла) без расширение связки. Это может быть переопределено в application.xml. Также, <application-name> применимо только если bean упакован внутри .ear.
  • <module-name> по умолчанию присваивается имя (.war или .jar) без расширение связки. Опять же, это может быть переопределено в ejb-jar.xml.
  • <bean-name> по умолчанию используется неквалифицированное имя класса bean. Однако, если @Stateful или @Stateless или @Singleton использует name, тогда значение указанные здесь будут использоваться в качестве bean имя.

Ответ 2

Имя приложения и имена модулей можно просмотреть во время выполнения через 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

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

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

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