Начну пожалуй издалека. Когда то при поступлении на работу, мне выдали тестовое задание, написать простенькое веб приложение с использование EJB. Никаких конкретных требований тогда не было, приложение должно работать, неважно как и неважно на чём. Сначала пытался читать доки, мануалы, различные статьи, но нигде небыло и намека на то как это сделать быстро и качественно. Наткнулся на статью о том как легко и просто можно сделать используя NetBeans+GlassFish. Проект был готов буквально за пару дней из-за невероятного количества приблуд и приятных мелочей, таких как автодеплой проекта, авто-маппинг бинов, создание сущностей и тд и тп. Все это было сделано без вникания, понимания и разбора.
И вот спустя полтора года, возникла задача. Развернуть JBoss + EJB3. Начался активный поиск по различным форумам, чтение документаций и прочее-прочее. 99% примеров это eclipse+какой-то-плагин, что меня в корне не устраивало. Начал копать еще глубже, находил статьи для JBoss 4.2 и EJB2.1 но все это в корне отличалось от сегодняшних технологий. Прошла неделя, и вот, в 04:00 30.04.2011 произошло знаменательное событие, мне удалось запустить полноценное работающее приложение написанное с нуля, на чистой системе.
Пожалуй начну, по порядку и по пунктам, поехали:
И вот спустя полтора года, возникла задача. Развернуть JBoss + EJB3. Начался активный поиск по различным форумам, чтение документаций и прочее-прочее. 99% примеров это eclipse+какой-то-плагин, что меня в корне не устраивало. Начал копать еще глубже, находил статьи для JBoss 4.2 и EJB2.1 но все это в корне отличалось от сегодняшних технологий. Прошла неделя, и вот, в 04:00 30.04.2011 произошло знаменательное событие, мне удалось запустить полноценное работающее приложение написанное с нуля, на чистой системе.
Пожалуй начну, по порядку и по пунктам, поехали:
- Для разработки приложения необходим JBoss 6.0.0 и jdk 1.6. В качестве базы данных была выбрана база MySQL 5.x.x, собиралось все с помощью Apache Ant
- Установка JBOSS — распаковываем архив, на этом собственно всё.
- Задаём jndi.properties для корректного коннекта к jboss (пригодится в дальнейшем):
Создаем файл jndi.properties и пишем в него:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
Теперь копируем его в %JAVA_HOME%\lib - Скачиваем mysql-jdbc-connector для версии mysql 5.x.x (ну или какую вы там используете) и кидаете в папку %JBOSS_HOME%\server\default\lib
- Отлично, дальше учим jboss понимать с какой базой ему предстоит работать.
Создаем файл mysql-ds.xml и пишем в него:
Копируем сюда: %JBOSS_HOME%\server\default\<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySQLDS</jndi-name>
<connection-url>jdbc:mysql://localhost/library</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>1234</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
</local-tx-datasource>
</datasources>
- Создаем пару Entity классов Book и Reader, один session LibraryBean и интерфейс для него Library. Лежат в директории src.my.bean приводить их тут не буду. Ссылка для скачивание примера в конце статьи.
- Далее самое интересное, как верно замаппить бины, почему то на всех форумах и всех документациях пишут для jboss 4.2 либо 5.1, что совершенно не подходит для 6.0 (а может и подходит, но руки у меня корявки).
Создаем persistence.xml и пишем в него:
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="example">
<jta-data-source>java:/MySQLDS</jta-data-source>
<clаss>my.bean.Book</clаss>
<clаss>my.bean.Reader</clаss>
<prоperties>
<prоperty name="hibernate.hbm2ddl.auto" value="create-drop"/>
</prоperties>
</persistence-unit>
</persistence>
Копируем его в папку META-INF- Собственно всё. Основные приготовление сделаны. Осталось выполнить следующие команды из папки проетка используя cmd:
set JAVA_HOME=[путь до JDK]
set JBOSS_HOME=[путь до вашего любимого jboss]
ant- Поднимаем сервер, делается легко и просто. Идем в папку %JBOSS_HOME%\bin -> run.bat
- В логе сервера должно появится примерно следующее сообщение:
2011-05-01 02:20:24,253 INFO [org.jboss.ejb3.EJBContainer] (HDScanner) STARTED EJB: my.bean.LibraryBean ejbName: LibraryBean
2011-05-01 02:20:24,292 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (HDScanner) Binding the following Entries in Global JNDI:
LibraryBean/remote - EJB3.x Default Remote Business Interface
LibraryBean/remote-my.bean.Library - EJB3.x Remote Business Interface
Это означает что бин успешно подцепился и мы будем при подъёме бинов использовать следующее именование: LibraryBean/remote.- Написание клиента для проверки.
Собственно писать ничего не надо, всё уже написано. Смотрим в папку src.my.client.Client.java
Хотелось бы сделать небольшое пояснение, когда создаем InitialContext желательно писать тоже самое что в п.2, а то ничего не заработает.
Должно получаться что-то вроде такого:
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "localhost:1099");
InitialContext initCont = new InitialContext(properties);
Ну и обращаемся к бину через созданный контекст initCont.lookup(«LibraryBean/remote»);- Для проверки всего вышесделанного, запускаем клиент. Если все нормально должно появиться сообщение вида: У читателя «Some Person» есть книга «EJB3: hardcore»
- На всякий случай приложу дамп базы. Покоится в dump.sql.
Этот пример для профессионалов покажется слишком простым и бесполезным, новичкам же думаю подойдет в самый раз.
Пример на основе которого написана статья лежит здесь.
Скачать все необходимое, а так же исходники можно тут. - Собственно всё. Основные приготовление сделаны. Осталось выполнить следующие команды из папки проетка используя cmd: