Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология Enterprise Java Beans. Часть 1
Создание проекта для компонента в Eclipse-WTP
Все готово, чтобы реализовать код в проекте Eclipse-WTP.Будут рассмотрены две реализации данного компонента - одна только при помощи технического средства Ant,встроенного в EcIipse-WTP,а другая - при помощи внутренних средств EcIipse-WTP,предназначенных для развертывания компонентов на различных контейнерах EJB.Начнем с создания проекта. Выберем закладку File->New->Project в главном меню.
Eclipse-WTP позволяет создавать специальные типы проектов для EJB.Но для того, чтобы лучше понять сам процесс создания и развертывания компонент EJB,сделаем обычный Java- проект (Рис. 3.1).
Зададим проекту название CorrectTime (Рис. 3.2).
Создаем каталог ejbModuIe для исходных кодов EJB -компонента. Делается это при помощи опции Create new source folder (Рис. 3.3).
После того, как создан каталог с исходным кодом, создается пакет для классов компонента. Делается это при помощи щелчка правой кнопкой мыши на папке с исходными кодами и выбора пункта меню New->Package (Рис. 3.4).
После этого необходимо подключить необходимые библиотеки JBoss - jbossall-client.jar и jboss-j2ee.jar. Они находятся в подкаталоге client каталога, в который был установлен JBoss.Необходимые библиотеки можно добавить, войдя в закладку Project главного меню: Project -> Properties -> Java Build Path -> Add External Jars, и затем выбрав в появившейся форме необходимые библиотеки (Рис. 3.5).
Необходимые приготовления выполнены, теперь можно приступать непосредственно к написанию кода компонента и клиента.
Вначале создаем удаленный интерфейс. Делается это правым щелчком мыши на соответствующем пакете и выборе New -> Interface. В появившемся меню (Рис. 3.6) можно выбрать имя интерфейса, а также те интерфейсы, от которых он наследуется (extends).В качестве альтернативы, можно явным образом задать наследуемые интерфейсы прямо в коде.
Теперь в созданном удаленном интерфейсе задаем единственный метод obtainCorrectTime() компонента CorrectTimeBean (Рис. 3.7, Рис. 3.8).
Аналогичным образом создаем домашний интерфейс (Home Interface) (Рис. 3.9).
После этого создается непосредственно класс компонента (Рис. 3.10).
Теперь необходимо задать дескриптор развертывания (Deployment descriptor).Для этого в каталоге META-INF каталога с исходными кодами создаем файл ejb-jar.xml - дескриптор развертывания компонента (Рис. 3.11).
Дескриптор развертывания компонента создан (Рис. 3.12).Помимо этого файла в каталог META-INF следует положить файл MANIFEST.MF - для того, чтобы потом использовать его при создании JAR -архива с EJB -компонентом. Этот файл выглядит следующим образом:
Manifest-Version: 1.0
Class-Path:
Теперь займемся созданием кода клиента. Вначале создадим еще один каталог для исходных кодов клиента в корневом каталоге проекта. Назовем этот каталог client. Внутри него создадим пакет с названием correctTimeBeanClient,и в него уже поместим класс CorrectTimeClient. Клиентское приложение также будет упаковано в JAR -архив. Так что для него тоже нужно будет сделать файл MANIFEST.MF. Вот как он будет выглядеть:
Manifest-Version: 1.0
Main-class: correctTimeBeanClient.CorrectTimeClient
Class-path: CorrectTimeBean.jar jbossall-client.jar jboss-j2ee.jar
Main-class - это класс, который содержит в себе метод main(String args[]). В Class-path указываются библиотеки, которые необходимо подключить. Помимо jboss-client.jar и jboss-j2ee.jar,туда добавлен архив и с самим компонентом - это сделано для того, чтобы клиент смог использовать удаленные интерфейсы компонента. Можно было бы, конечно, поместить классы удаленных интерфейсов в отдельный архив, или добавить их непосредственно в архив к клиенту, но в этом примере для простоты было сделано так.
Теперь займемся написанием ANT -скрипта для сборки компонента, клиента, и размещению компонента на контейнере JBoss.В Eclipse-WTP есть встроенная поддержка ANT. Создаем в корневом каталоге проекта два файла - build.xml и build.properties. Файл buildproperties выглядит следующим образом:
# Отключает часть логов Ant verbose=no # Компилятор не будет добавлять debug-информацию в классы compile.debug=off # Путь до jboss jboss.server.home=C:\\ejb\\jboss\\server\\default
А вот так выглядит файл build.xml:
<?xml version="1.0"?> <project name="CorrectTimeEJB" default="all" basedir="."> <property name="app" value="${basedir}"/> <property name="bean.src" value="${app}/ejbModule"/> <property name="client.src" value="${app}/client"/> <property name="bean.lib" value="${app}/lib"/> <property name="client.lib" value="${app}/lib"/> <property name="bean.config" value="${bean.src}/META-INF"/> <property name="bean.name"value="CorrectTimeBean"/> <property name="client.name" value="CorrectTimeClient"/> <property name="client.deploy.dir" value="client-deploy"/> <property name="build" value="build"/> <property name="build.classesdir" value="${build}/classes"/> <property name="build.client.classesdir" value="${build}/classes-client"/> <property name="assemble" value="${basedir}/assembled"/> <property name="assemble-client" value="${basedir}/assembled-client"/> <target name="init"> <property file="${basedir}/build.properties"/> <path id="build.classpath"> <pathelement path="${build.classesdir}"/> <fileset dir="${bean.lib}" includes="*.jar"/> </path> <path id="build.client.classpath"> <pathelement path="${build.classesdir}"/> <pathelement path="${build.client.classesdir}"/> <fileset dir="${client.lib}" includes="*.jar"/> </path> </target> <target name="compile" depends="init"> <echo message="Compiling sources."/> <delete dir="${build.classesdir}"/> <mkdir dir="${build.classesdir}"/> <delete dir="${build.client.classesdir}"/> <mkdir dir="${build.client.classesdir}"/> <!--Compiling the java bean classes--> <javac srcdir="${bean.src}" destdir="${build.classesdir}" verbose="${verbose}" debug = "${compile.debug}" deprecation="yes"> <classpath refid="build.classpath"/> </javac> <!--Compiling the client classes--> <javac srcdir="${client.src}" destdir="${build.client.classesdir}" verbose="${verbose}" debug = "${compile.debug}" deprecation="yes"> <classpath refid="build.client.classpath"/> </javac> </target> <target name="ejbjar" depends="compile"> <echo message="Assembling JBoss ${bean.name} module." /> <delete dir="${assemble}"/> <mkdir dir="${assemble}"/> <jar destfile="${assemble}/${bean.name}.jar"> <!-- classes -- > <fileset dir="${build.classesdir}"> <include name="**/*.class" /> </fileset> <!-- Descriptors --> <metainf dir="${bean.config}" includes="ejb-jar.xml"/> </jar> </target> <target name="clientjar" depends="compile"> <echo message="Assembling JBoss ${bean.name} module." /> <delete dir="${assemble-client}"/> <mkdir dir="${assemble-client}"/> <jar manifest="${client.src}/MANIFEST.MF" destfile="${assemble-client}/${client.name}.jar"> <!-- classes -- > <fileset dir="${build.client.classesdir}"> <include name="**/*.class" /> </fileset> </jar> </target> <target name="ejbdeploy" depends="ejbjar"> <echo message="Deploying ${bean.name} package to JBoss." /> <copy file="${assemble}/${bean.name}.jar" todir="${jboss.server.home}/deploy" /> </target> <target name="clientdeploy" depends="clientjar, ejbjar"> <delete dir="${client.deploy.dir}"/> <mkdir dir="${client.deploy.dir}"/> <echo message="Deploying ${client.name} package"/> <copy file="${assemble-client}/${client.name}.jar" todir="${client.deploy.dir}" /> <copy file="${assemble}/${bean.name}.jar" todir="${client.deploy.dir}"/> <copy todir="${client.deploy.dir}"> <fileset dir="${client.lib}"/> </copy> </target> <target name="all" depends="clientdeploy, ejbdeploy"> <echo message="Building project CorrectTime..."/> </target> </project>
Скрипт build.xml под управлением ANT сначала компилирует файлы компонента и клиента в два разных каталога. После этого, используя XML -дескриптор и файлы MANIFEST.MF,создает два JAR -архива - один архив компонента, а другой - архив клиента. Архив клиента он помещает в каталог развертывания клиента client-deploy (то есть тот каталог, в котором размещается JAR-архив клиентского приложения вместе с библиотеками и архивом компонента). Архив компонента помещается в каталог C:\ejb\jboss\server\default\deploy. На этом развертывание компонентов и клиента можно считать завершенным.
Запустить скрипт из Eclipse-WTP на исполнение, можно, открыв файл build.xml, а затем щелкнув правой кнопкой на имени проекта справа и выборе пункта Run As->Ant Build (Рис. 3.14).
Если все прошло успешно, то в нижней части экрана должно появиться соответствующее сообщение (Рис. 3.15).
Теперь можно запустить контейнер приложений JBoss.Стоит написать bat -файл для запуска JBoss,в котором будут выставляться значения переменных PATH и JAVAHOME,соответствующие JDK 1.4 или JDK 1.5.Это следует сделать из-за того, что БД Oracle также устанавливает свою версию JDK и прописывает все пути по умолчанию к своей версии JDK. А с этой версией JDK JBoss работать не будет.
set PATH=C:\Program Files\Java\jdk1.5.0_02\bin\ set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02 run
Запускаем JBoss посредством bat-файла из каталога bin.
Если развертывание прошло успешно, то в конце загрузки появится название компонента и его JNDI -имя (Рис. 3.16).
Теперь запускаем клиентское приложение. Для него тоже стоит создать bat -файл для запуска.
set PATH=C:\Program Files\Java\jdk1.5.0_02\bin\ set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02 java -jar CorrectTimeClient.jar
Если все было сделано правильно, но на экране появится точное время, полученное от компоненты с контейнера JBoss (Рис. 3.17).