Продукт IBM WebSphere Application Server Community Edition (далее – Community Edition) – это сертифицированный на соответствие Java™ Enterprise Edition 5 (Java EE5) сервер приложений, в состав которого интегрированы компоненты для работы с данными (Apache Derby), сервисами обмена сообщениями (Active MQ), Web-сервисами (Apache Axis) и т.д.
Этот продукт создан с использованием архитектуры Geronimo Beans (GBean) на базе продукта Apache Geronimo. Небольшой объем, простота использования, бесплатное распространение и опциональная поддержка мирового класса от IBM делают этот продукт идеальным решением для организаций малого и среднего размера.
Apache Tomcat – это созданный организацией Apache Software Foundation Web-контейнер, в котором реализованы API-интерфейсы Java Servlet и Java Server Pages. В продукте Tomcat Version 6.0.x реализованы API-интерфейсы Java Servlet 2.5 и Java Server Pages 2.1.
Хотя в этой статье описывается миграция пробного приложения с Tomcat 6.0.x на Community Edition 2.1, миграция с версии Tomcat 5.x будет очень похожа. Tomcat Version 5.x реализует API-интерфейсы версий Java Servlet 2.4 и Java Server Pages 2.0, а выпуск Community Edition 2.1 обратно совместим с этими версиями. Тем не менее, определенные различия в задании конфигураций могут иметь место.
В статье поэтапно описывается процесс миграции на Community Edition приложения, разработанного в среде Apache Tomcat. Для разработки приложений на Tomcat и Community Edition применялась интегрированная среда разработки Eclipse. Статья состоит из следующих разделов.
- Анализ архитектур – сходство и различия
- О тренировочном приложении
- Настройка Tomcat для развертывания приложения
- Развертывание приложения в среде Tomcat
- Миграция приложения на Community Edition
- Удаление ненужных сервисов из WAR-файла Community Edition
- Развертывание приложения в среде Community Edition
- Диагностика и устранение проблем миграции
Анализ архитектур – сходство и различия
Рисунок 1. Архитектура Geronimo (Community Edition)
Как показано на рис. 1, решение Community Edition основано на компонентной архитектуре. В его состав входят лучшие в своем классе продукты с открытым исходным кодом, созданные различными opensource-сообществами. Apache Tomcat является Web-контейнером по умолчанию для Community Edition, поэтому вы легко сможете осуществить миграцию разработанного в среде Apache приложения в среду Community Edition.
В среде Community Edition вы будете работать с тем же самым сервером Tomcat, с которым уже хорошо знакомы по работе с его автономной версией. В результате вам не придется переупаковывать свое приложение для Community Edition. Тем не менее, существуют некоторые различия, которые необходимо учитывать при миграции вашего приложения с Tomcat на Community Edition. Эти различия обусловлены следующей причиной. Поскольку Tomcat развернут в среде Community Edition как сервис, ему доступны возможности сертифицированного на соответствие Java EE5 сервера приложений, а не только контейнера сервлетов. Tomcat интегрирован с другими развернутыми в Community Edition контейнерными сервисами, такими как:
- JMS (Apache ActiveMQ)
- База данных (Apache Derby)
- EJB (Apache OpenEJB)
- Web-сервисы (Apache Axis)
- Persistence (Apache OpenJPA)
- Регистрация
- Безопасность
Чтобы преодолеть большинство проблем миграции, вы должны выяснить, как каждый из этих сервисов отображается в среде Tomcat и как он применяется в среде Community Edition. Базовая архитектура сервера Tomcat не меняется, однако в среде Community Edition он определен как Gbean-компонент. Эта реализация позволит легко интегрировать последующие версии Tomcat в будущие версии Community Edition.
В следующей таблице показаны основные различия между сервером Tomcat, работающим в автономном режиме, и сервером Tomcat, интегрированным в Community Edition:
Таблица 1. Сравнение функциональных возможностей Tomcat V6.0.x и Community Edition V2.1
| Функциональная возможность | Tomcat | Community Edition |
|---|---|---|
| Java-сервлеты | Реализует API-интерфейс Servlet 2.5 | Реализует API-интерфейс Servlet 2.5 |
| Java Server Pages | Реализует API-интерфейс JSP 2.1 | Реализует API-интерфейс JSP 2.1 |
| JNDI |
Ручное конфигурирование, как правило с использованием файла server.xml
| JNDI имеет доступ к объектным ссылкам, управляемым ядром Geronimo |
| JMS |
Ручное конфигурирование с использованием файла context.xml
| Для создания JMS-ресурсов может быть использован графический Web-интерфейс |
| JDBC-источник данных |
Ручное конфигурирование с использованием файла context.xml
| Для создания JDBC-источников данных может быть использован графический Web-интерфейс |
| Web-сервис (Apache Axis) | Данная функциональность реализуется посредством развертывания Axis.war | Продукт Axis заранее интегрирован в Community Edition. |
| Области безопасности |
Конфигурирование с использованием файла server.xml или context.xml
| Поддерживает управляемые контейнером области, которые доступны для авторизации всех компонентов. Поддерживается задание областей для отдельных компонентов. |
| Несколько коннекторов | Позволяет нескольким обработчикам протоколов обращаться к одному и тому же механизму. Например, HTTP-коннектор может работать с SSL-коннектором на том же самом механизме. | Консоль администратора может быть использована для конфигурирования различных коннекторов, включая HTTP-коннектор, SSL-коннектор и AJP13-коннектор (Apache Jserv Protocol), используемый для выравнивания нагрузки и кластеризации. |
| Виртуальные хосты |
Поддерживает хостинг различных Web-сайтов на одном сервере (одном IP-адресе). Эта опция конфигурируется с использованием файла server.xml
|
Аналогичная возможность реализуется посредством конфигурирования файла config.xml
|
| Дескриптор развертывания |
По умолчанию в качестве дескриптора развертывания Web-приложений на базе J2EE (WAR) используется файл
web.xml | По умолчанию в качестве дескриптора развертывания Web-приложений на базе J2EE (WAR) используется файл
web.xml
|
| План развертывания | Отсутствует специализированный план развертывания для продуктов конкретных поставщиков |
Community Edition имеет дескриптор развертывания для Geronimo, предназначенный для конфигурирования специфических для Geronimo сервисов. Для Web-приложения используется план развертывания geronimo-web.xml
|
В решении Community Edition большая часть конфигурирования может быть выполнена с использованием одного из следующих планов развертывания: geronimo-web.xml, config.xml или config-substitution.properties. Кроме того, с помощью Web-консоли администратора вы можете легко добавлять такие ресурсы, как JMS-очереди, фабрики подключения и JDBC-источники данных. Эта консоль упрощает управление конфигурациями по сравнению с ручным конфигурированием в среде Tomcat с использованием файлов server.xml и context.xml.
Тренировочное приложение, которое мы будем переносить из среды Tomcat V6.0.x в среду Community Edition V2.1, представляет собой программу для универсального магазина, созданную с использованием следующих компонентов:
- JSP-страницы
- Сервлеты
- JSP Standard Tag Library (JSTL)
- JDBC-источник данных Apache Derby
- JMS на базе Apache ActiveMQ
- Web-сервис на базе Apache Axis
Данное приложение для аутентификации пользователей использует задаваемую по умолчанию в среде Tomcat область UserRealm, а Community Edition по умолчанию использует область geronimo-admin.
Тренировочное приложение, включенное в эту статью, состоит из единственного WAR-модуля со следующим контентом:
- generalstore.jsp - Представляет пользователю каталог магазина. Отображает текущий курс акций IBM через внешний Web-сервис.
- checkoutcart.jsp - Представляет пользователю корзину для покупок. Использует RDBMS через источник данных Derby для отображения рекламных сообщений. Отображает текущий курс акций IBM через внешний Web-сервис.
- generalstore.css - Таблица стилей, используемая для форматирования HTML-элементов обеими JSP-страницами.
- StockService.wsdl - Описывает местоположение Web-сервисов и методов, доступных в пределах сервисов. Этот WSDL-файл используется для генерации необходимых классов Java, а инструментарий Eclipse используется для генерации файлов этих классов.
- StoreController.java - Основной контроллер для маршрутизации запросов в JSP-страницы. Также получает информацию о категории и товаре, после чего присоединяет эту информацию в качестве атрибутов для отображения JSP-страницами.
-
GeneralStore.java - Содержит методы, возвращающие необходимые для приложения данные. Также содержит функции, реализующие специализированную библиотеку тегов (см.
generalstore-taglib.tld). - Category.java, Product.java, LineItem.java - JavaBean-компоненты, используемые для хранения значений при перемещении данных между моделью и представлением приложения.
- CheckOut.java - Завершает заказ и отсылает его менеджеру по управлению запасами.
Настройка Tomcat для развертывания приложения
По умолчанию сервер Tomcat слушает запросы на порту 8080.
Изменение этого порта осуществляется в файле <Tomcat_Home>/conf/server.xml. На листинге 1 показано, как изменить конфигурацию порта по умолчанию.
Листинг 1. Конфигурация коннектора Tomcat в файле server.xml
<Service name="Catalina">
...
...
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
|
Измените значение прежнее порта на любое нужное значение. Не забудьте остановить сервер до внесения каких-либо конфигурационных изменений в файл server.xml. Перезапустите сервер, чтобы измененные параметры вступили в силу.
Конфигурирование области аутентификации Tomcat
Область в Tomcat хранит информацию о пользователе, группе и пароле. По умолчанию в Tomcat настроена область UserDatabaseRealm, позволяющая производить аутентификацию пользователя перед предоставлением ему доступа к магазину. Эта область также настроена в файле server.xml. На листинге 2 конфигурация этой области аутентификации в сегменте кода server.xml показана жирным шрифтом.
Листинг 2. Конфигурация области UserDatabaseRealm в файле server.xml
<Server port="8005" shutdown="SHUTDOWN">
...
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
...
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
...
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
|
Показанная выше конфигурация настраивает область UserDatabaseRealm на использование файла conf/tomcat-users.xml для хранения информации о пользователе, пароле и роли. Поскольку эта область настраивается на уровне <Engine>, она доступна всем хост-системам, выполняющимся в экземпляре компонента Tomcat <Engine>.
Для исполнения нашего приложение вам не нужно вносить какие-либо изменения в файл conf/server.xml, поскольку мы собираемся использовать конфигурацию по умолчанию. Однако вы должны внести определенные изменения в файл conf/tomcat-users.xml file, в котором область UserDatabaseRealm сохраняет всю информацию о пользователе. Выполните изменения в файле tomcat-users.xml, выделенные на листинге 3 жирным шрифтом.
Листинг 3. Добавление ролей admin и manager для пользователя Tomcat в файле tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/> <user username="role1" password="tomcat" roles="role1"/> <user username="both" password="tomcat" roles="tomcat,role1"/> </tomcat-users> |
В этом коде пользователю tomcat (с паролем tomcat) назначаются роли групп manager и admin.
В файле приложения web.xml контроллер магазина защищен; права доступа предоставляются только пользователям с ролью admin. В листинге 4 жирным шрифтом выделен код файла web.xml(находящегося в каталоге dd дистрибутива кода), который защищает приложение.
Листинг 4. Дескриптор развертывания web.xml с защитой доступа к приложению посредством аутентификации
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>ShoppingStore</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>GeneralStore</servlet-name>
<servlet-class>com.ibm.wasce.store.StoreController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GeneralStore</servlet-name>
<url-pattern>/store.cgi</url-pattern>
</servlet-mapping>
<resource-ref>
<description>Derby DB connection</description>
<res-ref-name>jdbc/storeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<security-constraint>
<display-name>General Store Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Entire store</web-resource-name>
<url-pattern>*.cgi</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Shopping Realm</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<servlet>
<description></description>
<display-name>CheckOut</display-name>
<servlet-name>CheckOut</servlet-name>
<servlet-class>com.ibm.wasce.store.CheckOut</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckOut</servlet-name>
<url-pattern>/CheckOut</url-pattern>
</servlet-mapping>
</web-app>
|
Элементы <security-constraint> и <security-role> в приведенном выше коде – стандартные элементы конфигурации безопасности J2EE – являются переносимыми между контейнерами. Другими словами, этот же файл web.xml будет работать позднее в среде Community Edition.
Настройка сетевого сервера Derby
Сначала убедитесь в том, что, что у вас установлен сервер Apache Derby 10.3.1. Затем выполните следующие шаги:
- Настройте переменную среды DERBY_INSTALL на свой каталог установки Derby и включите следующие элементы в свою переменную среды CLASSPATH:
- lib/derby.jar
- lib/derbytools.jar
- lib/derbynet.jar
- lib/derbyclient.jar
- Запустите сервер Derby при помощи следующей команды:
java org.apache.derby.drda.NetworkServerControl start
Сервер Derby запустится и начнет прослушивать порт по умолчанию 1527.
- Создайте базу данных с именем
generalstore, которая содержит только одну таблицу с именемpromotions. Для создания и заполнения этой базы данных значениями используется скриптcreatedb1.sql.Для выполнения SQL-скрипта воспользуйтесь командой ij:
java org.apache.derby.tools.ij createdb1.sql
Скрипт createdb1.sql содержит SQL-команды, показанные на листинге 5.
Листинг 5. Скрипт createdb1.sql script: Создает таблицу базы данных и заполняет ее данными
connect 'jdbc:derby://localhost/generalstore;create=true';
drop table promotion;
create table promotion
(id char (5) not null,
message char(40) not null,
primary key(id));
insert into promotion values ('1', 'Thank your for your order.');
insert into promotion values ('2', 'Have a nice day!');
exit;
|
Если вы видите сообщение ERROR 08001: No suitable driver, это значит, что необходимая библиотека lib/derbyclient.jar не найдена в вашей переменной среды CLASSPATH.
Настройка JMS-брокера Apache ActiveMQ
Убедитесь в том, что у вас установлен компонент apache-activemq-4.1.1, после чего выполните следующие шаги:
-
Включите следующие элементы в свою переменную среды CLASSPATH:
- lib/activeio-core-3.0.0-incubator.jar
- lib/commons-logging-1.1.jar
- <ActiveMQ_HOME>/apache-activemq-4.1.1.jar
-
2. Запустите брокер ActiveMQ посредством исполнения скрипта
activemq.bat. Вы сможете найти этот скрипт в каталоге<ActiveMQ_HOME>/bin.
Включите следующие элементы в свою переменную среды CLASSPATH. Вы сможете автоматически загрузить перечисленные ниже JAR-файлы из среды Eclipse. Дополнительная информация приведена в разделе Удаление ненужных сервисов из WAR-файла Community Edition.
- wsdl4j-1.5.1.jar
- saaj.jar
- jaxrpc.jar
- axis.jar
Ссылка на JNDI-ресурс Tomcat и JDBC-коннектор
Страница checkoutcart.jsp использует JSTL-теги поддержки SQL для обращения к рекламной базе данных и выводит на печать рекламные сообщения. На листинге 6 показан фрагмент кода, который обращается к RDBMS.
Листинг 6. JSP-код в файле checkoutcart.jsp, обращающийся к серверу базы данных
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="storetags" uri="/GeneralStoreTagLibrary" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
...
<sql:query var="rs" dataSource="jdbc/storeDB">
select * from promotion
</sql:query>
...
<tr>
<td colspan="5">
<c:forEach var="row" items="${rs.rows}">
${row.message}<br/>
</c:forEach>
</td>
</tr>
|
JSTL-тег <sql:query> будет искать, через JNDI, источник данных с именем jdbc/storeDB. Ссылка на это имя определяется стандартным для J2EE способом в дескрипторе развертывания приложения - web.xml. Эта стандартная конфигурация будет работать и с Tomcat, и с Community Edition. Данная конфигурация показана на листинге 7.
Листинг 7. Элемент в web.xml, специфицирующий ссылку на JNDI-источник данных
<resource-ref>
<description>Derby DB connection</description>
<res-ref-name>jdbc/storeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
|
Теперь вы должны настроить эту ссылку на соответствие реальному JDBC-драйверу и соединению с RDBMS зависящим от контейнера способом – т.е. по-разному для Tomcat и для Community Edition. В случае Tomcat эта ссылка настраивается в файле conf/context.xml (который находится в каталоге установки Tomcat) (см. листинг 8).
Листинг 8. Специфический для Tomcat дескриптор context.xml, связывающий JNDI-ресурс с JDBC-коннектором Derby
<Context>
...
...
<Resource name="jdbc/storeDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
driverClassName="org.apache.derby.jdbc.ClientDriver"
user="APP" password="APP"
url="jdbc:derby://localhost/generalstore"/>
...
...
</Context>
|
Конфигурирование Tomcat для брокера ActiveMQ
В случае успешного размещения заказа сервлет CheckOut.java.java отображает соответствующее сообщение. На листинге 9 показан фрагмент кода сервлета, который ищет фабрику подключения и очередь.
Листинг 9. Фрагмент кода сервлета
Context initContext = new InitialContext();
Context jndiContext=(Context) initContext.lookup("java:comp/env");
connectionFactory = (ConnectionFactory) jndiContext.lookup("jms/ConnectionFactory");
queue = (Queue) jndiContext.lookup("jms/aQueue");
|
Ссылки имени на фабрику подключения и на очередь задаются в файле web.xml, как показано на листинге 10.
Листинг 10. JMS-элементы файла web.xml, специфицирующие фабрику подключения и очередь
<resource-ref>
<description>jms broker</description>
<res-ref-name>jms/ConnectionFactory</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<message-destination-ref>
<message-destination-ref-name>jms/aQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>ConsumesProduces</message-destination-usage>
<message-destination-link>aQueue</message-destination-link>
</message-destination-ref>
<message-destination>
<message-destination-name>aQueue</message-destination-name>
</message-destination>
|
Теперь вы должны настроить Tomcat для фабрики подключения ActiveMQ и для очереди пункта назначения ActiveMQ, также специфическим для конкретного контейнера способом. В случае Tomcat конфигурирование осуществляется в файле conf/context.xml (который находится в каталоге установки Tomcat). На листинге 11 показаны параметры фабрики подключения и очереди пункта назначения.
Листинг 11. Специфический для Tomcat дескриптор context.xml для конфигурации брокера ActiveMQ
<Context>
...
...
<Resource
name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://localhost:61616"
brokerName="localhost"
persistent="false"
useEmbeddedBroker="false"/>
<Resource name="jms/aQueue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="MY.TEST.QUEUE"/>
...
...
</Context>
|
Генерация класса Web-сервисов с использованием StockService.wsdl
В этом разделе мы осуществим генерацию класса Web-сервисов.
- На листинге 12 показан WSDL-файл, необходимый для генерации артефактов Web-сервисов.
Листинг 12. Файл StockService.wsdl для генерации артефактов Web-сервисов
<wsdl:definitions xmlns:http=http://schemas.xmlsoap.org/wsdl/http/ xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:s=http://www.w3.org/2001/XMLSchema xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/ xmlns:tns=http://www.webserviceX.NET/ xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/ xmlns:mime=http://schemas.xmlsoap.org/wsdl/mime/ targetNamespace=http://www.webserviceX.NET/ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET/"> <s:element name="GetQuote"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="GetQuoteResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="string" nillable="true" type="s:string"/> </s:schema> </wsdl:types> <wsdl:message name="GetQuoteSoapIn"> <wsdl:part name="parameters" element="tns:GetQuote"/> </wsdl:message> <wsdl:message name="GetQuoteSoapOut"> <wsdl:part name="parameters" element="tns:GetQuoteResponse"/> </wsdl:message> <wsdl:message name="GetQuoteHttpGetIn"> <wsdl:part name="symbol" type="s:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpGetOut"> <wsdl:part name="Body" element="tns:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpPostIn"> <wsdl:part name="symbol" type="s:string"/> </wsdl:message> <wsdl:message name="GetQuoteHttpPostOut"> <wsdl:part name="Body" element="tns:string"/> </wsdl:message> <wsdl:portType name="StockQuoteSoap"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteSoapIn"/> <wsdl:output message="tns:GetQuoteSoapOut"/> </wsdl:operation> </wsdl:portType> <wsdl:portType name="StockQuoteHttpGet"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteHttpGetIn"/> <wsdl:output message="tns:GetQuoteHttpGetOut"/> </wsdl:operation> </wsdl:portType> <wsdl:portType name="StockQuoteHttpPost"> <wsdl:operation name="GetQuote"> <wsdl:input message="tns:GetQuoteHttpPostIn"/> <wsdl:output message="tns:GetQuoteHttpPostOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap"> <soap:binding transport=http://schemas.xmlsoap.org/soap/http style="document"/> <wsdl:operation name="GetQuote"> <soap:operation soapAction=http://www.webserviceX.NET/GetQuote style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet"> <http:binding verb="GET"/> <wsdl:operation name="GetQuote"> <http:operation location="/GetQuote"/> <wsdl:input> <http:urlEncoded/> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost"> <http:binding verb="POST"/> <wsdl:operation name="GetQuote"> <http:operation location="/GetQuote"/> <wsdl:input> <mime:content part="NMTOKEN" type="application/x-www-form-urlencoded"/> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="StockQuote"> <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap"> <soap:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> <wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet"> <http:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> <wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost"> <http:address location="http://www.webservicex.net/stockquote.asmx"/> </wsdl:port> </wsdl:service> </wsdl:definitions> - Нажмите правой кнопкой мыши на файле Stock Service.wsdl (показан на рис. 2) и последовательно выберите Web Services – Generate Client.
Рисунок 2. Генерация артефактов Web-сервисов при помощи файла StockService.wsdl
- На этом шаге будет произведена автоматическая генерация всех артефактов, необходимых для Web-сервисов. Будут сгенерированы следующие классы, как показано на рис. 3.
- StockQuote.java
- StockQuoteLocator.java
- StockQuoteSoap.java
- StockQuoteSoapProxy.java
- StockQuoteSoapStub.java
Кроме того, этот шаг загружает JAR-файлы, упомянутые в разделе V **add link** и перемещает эти файлы в файл
WEB-INF/libприложения.
Рисунок 3. Сгенерированные классы Web-сервисов
- Для доступа к Web-сервисам в нашем приложении используется код из листинга 13, добавленный к файлам
checkoutcart.jspиgeneralstore.jsp.Листинг 13. Фрагмент кода для доступа к котировке акций IBM
<% StockQuoteLocator sql = new StockQuoteLocator(); StockQuoteSoap sqs = sql.getStockQuoteSoap(); PrintWriter out1 =response.getWriter(); String s1=sqs.getQuote("IBM"); s1=s1.substring(46,51); %>
В нашем случае мы передаем
IBMкак переменную, которая будет извлекать биржевые цены IBM из Web-сервисаStock.
Развертывание приложения в среде Tomcat
В этом разделе мы развернем свое приложение в среде Tomcat. Выполните следующие шаги.
- Экспортируйте приложение из Eclipse в виде WAR-файла.
- Запустите Tomcat и откройте Web-консоль с помощью следующей команды:
http://localhost:8080/manager/html - Будет запрошена регистрационная информация (здесь используется область безопасности
UserDatabaseRealm, которую мы настроили ранее). Поскольку необходима роль manager, введитеtomcatв поля user name (имя пользователя) и password (пароль). - Приложение manager отобразит все развернутые модули. Прокрутите список до конца, где должен находиться прямоугольник Deploy directory or WAR file located on server (Развернуть каталог или WAR-файл, размещенный на сервере). В поле Context path введите /Shopping, а в поле WAR or Directory URL введите абсолютный путь к файлу
generalstore.war. - Нажмите кнопку Deploy. Теперь вы должны увидеть, что приложение General Store работает с контекстом
/Shopping. Рис. 4 показано приложение manager после успешного развертывания
Рисунок 4. Успешное развертывание приложения на Tomcat
- Для доступа к приложению введите следующий URL: http://localhost:8080/Shopping/store.cgi (EN).
Миграция приложения на Community Edition
В общем случае, для миграции приложения General Store на Community Edition необходимо выполнить следующие шаги.
- Настройте и замените область Tomcat
UserDatabaseRealmна область аутентификации, управляемую контейнером Community Edition. Запустите Derby RDBMS, включенную в Community Edition, и используйте ее вместо автономной версии Derby. - Создайте новый источник данных, управляемый Community Edition.
- Создайте необходимую таблицу базы данных и заполните ее данными.
- Настройте JNDI-ссылку для указания на источник данных Derby в Community Edition.
- Настройте фабрику подключения и очередь JMS-брокера ActiveMQ в Community Edition.
Элементы, которые не нужно менять во время миграции:
- JNDI-ссылка на источник данных в
web.xml. - Конфигурация безопасности в файле
web.xml, защищающая приложение.
Эти элементы специально написаны таким образом, чтобы обеспечивалась их переносимость между J2EE-контейнерами
Изменение портов, используемых коннекторами Tomcat в Community Edition
Если вам нужно изменить порт, используемый коннекторами Tomcat в Community Edition, не ищите файл server.xml; такого файла нет в Community Edition. Вместо этого посмотрите на файл config-substitutions.properties в подкаталоге var/config каталога установки Community Edition. На листинге 14 показана конфигурация портов в Community Edition.
Листинг 14. Конфигурация портов Tomcat в Community Edition
AJPPort=8009
clusterNodeName=NODE
ORBPort=6882
MaxThreadPoolSize=500
ResourceBindingsNamePattern=
SMTPHost=localhost
ResourceBindingsQuery=?\#org.apache.geronimo.naming.ResourceSource
COSNamingPort=1050
webcontainer=TomcatWebContainer
OpenEJBPort=4201
ORBSSLPort=2001
PortOffset=0
ActiveMQStompPort=61613
JMXPort=9999
ORBHost=localhost
EndPointURI=http\://localhost\:8080
NamingPort=1099
DefaultWadiSweepInterval=36000
WebConnectorConTimeout=20000
HTTPSPort=8443
COSNamingHost=localhost
MinThreadPoolSize=200
ReplicaCount=2
ServerHostname=0.0.0.0
ActiveMQPort=61616
ORBSSLHost=localhost
SMTPPort=25
webcontainerName=tomcat6
ResourceBindingsNameInNamespace=jca\:
DefaultWadiNumPartitions=24
HTTPPort=8080
clusterName=CLUSTER_NAME
ClusterName=DEFAULT_CLUSTER
ResourceBindingsFormat={groupId}/{artifactId}/{j2eeType}/{name}
RemoteDeployHostname=localhost
TmId=71,84,77,73,68
|
Для изменения конфигурации портов по умолчанию вы можете модифицировать код на листинге 14 для Community Edition. Вы также можете убрать комментарии с переменной PortOffset и ввести выбранное вами значение. В результате настройки портов для всех сервисов в Community Edition сместятся на заданное вами значение PortOffset. Например, если вы зададите значение PortOffset=10, то ваш HTTP-порт будет иметь значение 8090, а консоль администратора будет иметь URL http://localhost:8090/console.
Не забудьте остановить автономную базу данных Derby, использовавшуюся приложением Tomcat, с помощью следующей команды: java org.apache.derby.drda.NetworkServerControl stop
В качестве альтернативного варианта вы можете использовать Web-консоль для добавления коннектора Tomcat, либо изменить номер порта, используемый с коннектором. Для этого достаточно выбрать Server - Web Server в меню Web-консоли. После редактирования и сохранения измененного номера порта осуществите перезапуск для немедленного вступления в силу указанных изменений. Если вы используете этот номер порта для отображения консоли администратора, не забудьте изменить этот номер порта в адресной строке своего браузера для восстановления отображения консоли.
Конфигурирование области аутентификации, управляемой Community Edition
По умолчанию Community Edition управляет областью с именем geronimo-admin, которая использует файл свойств в каталоге var/security для хранения информации о пользователе, пароле и группе. Единственным пользователем, настроенным в этой области, является пользователь system с паролем manager, принадлежащий группе/роли admin. Вы можете добавлять пользователей и группы к этой области по умолчанию с помощью опции Security - Console Realm в меню Web-консоли.
Вы можете конфигурировать эту область безопасности в плане развертывания Community Edition geronimo-web.xml. Вам необходимо добавить код из листинга 15 в файл geronimo-web.xml.
Листинг 15. Конфигурация области безопасности в Community Edition
<security-realm-name>geronimo-admin</security-realm-name>
<sec:security>
<sec:default-principal realm-name="geronimo-properties-realm">
<sec:principalclass="org.apache.geronimo.
security.realm.providers.GeronimoUserPrincipal" name="system"/>
</sec:default-principal>
<sec:role-mappings>
<sec:role role-name="admin">
<sec:realm realm-name="geronimo-admin">
<sec:principalclass="org.apache.geronimo.
security.realm.providers.GeronimoGroupPrincipal" name="admin"/>
<sec:principalclass="org.apache.geronimo.
security.realm.providers.GeronimoUserPrincipal" name="system"/>
</sec:realm>
</sec:role>
</sec:role-mappings</sec:security>
|
Создание таблицы Promotion в базе данных Community Edition
Вы можете легко создать таблицу Promotion в Community Edition с помощью графической Web-консоли:
- Запустите сервер.
- Запустите консоль администратора с помощь команды:
http://localhost:8080/console. - Введите значения по умолчанию: user name (
system) и password (manager). - В навигационном меню консоли в секции Embedded DB выберите пункт DB Manager (см. рис. 5):
Рисунок 5. Портлет DB в консоли администратора
- На следующем экране (рис. 6) в окошке Create DB введите имя
generalstoreи нажмите кнопку Create.
Рисунок 6. Создание базы данных generalstore
- В ниспадающем меню Use DB выберите пункт generalstore и выполните скрипт, показанный на листинге 16 и на рис. 7.
Листинг 16. Скрипт для создания таблицы promotion в Community Edition
create table promotion (id char (5) not null, message char(40) not null, primary key(id)); insert into promotion values ('1', 'Thank your for your order.'); insert into promotion values ('2', 'Have a nice day!');
Рисунок 7. Создание таблицы promotion
Создание источника данных Derby в Community Edition
- Запустите консоль администратора с помощь команды: http://localhost:8080/console. Введите значения по умолчанию для user name и password (system и manager, соответственно).
- В навигационном меню консоли в секции Services выберите пункт Database Pools.
- В следующем окне (рис. 8) выберите пункт: Using Geronimo database pool wizard (Использовать мастера пулов баз данных Geronimo)
Рисунок 8. Выбор мастера пулов баз данных Geronimo
- В окошке Name of Database pool (Имя пула баз данных) введите имя
SampleDS; в окошке Database Type (Тип базы данных) введите Derby Embedded XA (см. рис. 9). Нажмите Next.
Рисунок 9. Создание пула баз данных в Community Edition
- В окне мастера заполните форму как показано на рис. 10. Обратите внимание, что здесь в поле Password надо ввести
APP. Нажмите Deploy.
Рисунок 10. Создание пула баз данных в Community Edition
- После успешного развертывания вы сможете видеть источник данных
SampleDS, добавленный в список развернутых пулов в Community Edition (см. рис. 11).
Рисунок 11. Источник данных SampleDS в списке развернутых пулов базы данных
- Вы сможете ассоциировать источник данных
SampleDSс JNDI-ссылкойjdbc/storeDBв файлеweb.xmlс помощью элементов <dependency> и <resource-ref> в плане развертывания geronimo-web.xml (см. листинг 17).
Листинг 17. Фрагмент кода из плана развертывания geronimo-web.xml
<sys:dependency> <sys:groupId>console.dbpool</sys:groupId> <sys:artifactId>SampleDS</sys:artifactId> </sys:dependency> <naming:resource-ref> <naming:ref-name>jdbc/storeDB</naming:ref-name> <naming:resource-link>SampleDS</naming:resource-link> </naming:resource-ref>
Создание фабрики подключения и очереди ActiveMQ
С помощью графической Web-консоли вы сможете легко создать управляемые Community Edition фабрику подключения и очередь.
- Запустите консоль администратора. В навигационном меню консоли в секции Services выберите пункт JMS Resources. На следующем экране выберите пункт For ActiveMQ.
- На следующем экране заполните форму, как показано на рис. 12. Нажмите на кнопку Next.
Рисунок 12. Конфигурирование группы JMS-ресурсов
-
На следующем экране (рис. 13) нажмите на кнопку Add Connection Factory
Рисунок 13. Добавление Connection Factory
- В меню JMS Factory Type выберите пункт javax.jms.ConnectionFactory (рис. 14) и нажмите Next
Рисунок 14. Добавление Connection Factory
. - Заполните форму как показано на рис. 15. Нажмите Next.
Рисунок 15. Добавление Connection Factory
- На следующем экране (рис. 16) нажмите Add Destination для добавления очереди.
Рисунок 16. Добавление пункта назначения (Destination)
- В ниспадающем меню выберите пункт javax.jms.Queue (рис. 17). Нажмите Next.
Рисунок 17. Установка типа адресата
- В поле Message Destination Name введите jms/aQueue, как показано на рис. 18. Нажмите Next.
Рисунок 18. Добавление очереди (Queue)
- На следующем экране (рис. 19) нажмите кнопку Deploy Now, которая развертывает план ресурсов в среде Community Edition.
Рисунок 19. Развертывание плана ресурса в среде Community Edition
- В случае успешного развертывания вы сможете увидеть ресурс migration (миграция) среди доступных JMS-ресурсов (см. рис. 20).
Рисунок 20. JMS-ресурс migration в списке доступных ресурсов
- Вы можете ассоциировать фабрику подключения и очередь, которые уже присутствуют в файле
web.xml, с помощью элементов<dependency>и<resource-ref>плана развертыванияgeronimo-web.xml, как показано на листинге 18.
Листинг 18. Фрагмент кода из плана развертывания geronimo-web.xml
<sys:dependency> <sys:groupId>org.apache.geronimo.configs</sys:groupId> <sys:artifactId>activemq-ra</sys:artifactId> <sys:version>2.1.1</sys:version> <sys:type>car</sys:type> </sys:dependency> ... ... <naming:resource-ref> <naming:ref-name>jms/ConnectionFactory</naming:ref-name> <naming:pattern> <naming:groupId>org.apache.geronimo.configs</naming:groupId> <naming:artifactId>activemq-ra</naming:artifactId> <naming:version>2.1.1</naming:version> <naming:name>DefaultActiveMQConnectionFactory</naming:name> </naming:pattern> </naming:resource-ref> <naming:message-destination> <naming:message-destination-name> aQueue </naming:message-destination-name> <naming:admin-object-link> SendReceiveQueue </naming:admin-object-link> </naming:message-destination>
Удаление ненужных сервисов из WAR-файла Community Edition
При сравнении размера «тренировочного» файла ShoppingStore_Tomcat.war (приблизительно 9 МБ) с размером аналогичного файла ShoppingStore_CommunityEdition.war (приблизительно 32 КБ) у вас может возникнуть вопрос о причинах столь больших различий. Причина заключается в следующем: все сервисы (Axis, JMS, общие блоки т.д.) и драйверы базы данных Derby, которые необходимо включать в каталог устанавливаемого на Tomcat приложения (WEB-INF\lib), уже интегрированы в Community Edition. Преимущество удаления этих jar-файлов состоит в том, что вам не придется интегрировать и поддерживать эти файлы.
В каталог WEB-INF\lib уже включены следующие jar-файлы из ShoppingStore_Tomcat.war:
- activeio-core-3.0.0-incubator.jar
- apache-activemq-4.1.1.jar
- axis.jar
- commons-discovery-0.2.jar
- commons-logging.jar
- derby.jar
- derbyclient.jar
- derbynet.jar
- derbytools.jar
- jaxrpc.jar
- jstl.jar
- saaj.jar
- standard.jar
- wsdl4j-1.5.1.jar
Эти jar-файлы также включены в каталог Community Edition <WASCE_HOME>/repository. Чтобы определить, существует ли определенный JAR-файл, ищите в каталоге /repository имя соответствующего компонента без номера версии (например, activeio-core) или без источника (например, activemq). Нужный jar-файл в /repository будет содержать номер версии (например, axis1-4.jar). JAR-файлы, которые не перечислены в /repository (например, специфические для конкретного приложения файлы), должны присутствовать в WEB-INF\l.
В данном примере миграции могут быть удалены все JAR-файлы в каталоге Tomcat WEB-INF\lib. Большинство Web-приложений помещает в каталог WEB-INF\lib некоторые специфические для приложения JAR-файлы, поэтому возможности по сокращению библиотеки будут зависеть от конкретной ситуации. JAR-файлы драйвера базы данных в общем случае должны быть установлены в \repository и использоваться совместно с приложениями. Консоль администратора помогает загружать и устанавливать файлы драйвера базы данных (т.е. Oracle или MySQL), которые не доступны в \repository (выберите Services - Database Pools - Using the Geronimo database pool wizard.)
Кроме того, в файле web.xml могут присутствовать параметры типа <servlet> , указывающие на JAR-файлы в каталоге WEB-INF\lib. Вам необходимо определить, не приведет ли удаление того или иного JAR-файла к необходимости изменений в файле web.xml.
Развертывание приложения в среде Community Edition
Для развертывания приложения запустите консоль администратора и выполните следующие шаги.
- В навигационном меню консоли в секции Applications выберите пункт Deploy New.
- Нажмите кнопку Browse рядом с текстовым полем Archive и отыщите файл Shoppingstore.war. После этого нажмите кнопку Install. В результате этого шага приложение будет развернуто в среде Community Edition (см. рис. 21).
Рисунок 21. Развертывание приложения в среде Community Edition
- Запустите приложение с помощью команды: http://localhost:8080/Shopping/store.cgi. 4. При появлении приглашения для входа введите
systemв поле user name иmanagerв поле password.
Диагностика и устранение проблем миграции
Использованное в этой статье тренировочное приложение содержит примеры конфигурирования и планов развертывания для типичной миграции со среды Tomcat. В это приложение включено множество ресурсов различного типа в качестве примеров развертывания. Пункт меню Deploy New в консоли администратора предоставляет детальное сообщение об ошибках для WAR-файла, развертывание которого закончилось неудачей.
Инструмент развертывания на основе скриптов также выдает ошибку, если WAR-файл не может быть развернут. Если ошибки происходят в процессе тестирования приложения, просмотрите журнал Eclipse Server или файл var\log\server.log (для Linux – файл geronimo.out) на предмет наличия ошибок Java, которые моли иметь место при доступе к приложению.
При миграции самыми распространенными являются следующие проблемы.
- Проблемы загрузчика классов Classloader
- Проблемы конфигурирования ресурсов
- Проблемы плана развертывания
Эти проблемы будут подробно рассмотрены в следующих разделах.
Проблемы загрузчика классов Classloader
По умолчанию в Community Edition применяется иерархия classloader, согласно которой сначала загружаются классы от родителя (то есть из \repository). Tomcat сначала загружает классы из приложения. Проблемы могут произойти в том случае, если приложение Tomcat использует более старые компоненты (напр. старую версию Axis) и структура API изменилась. В этом случае при развертывании WAR или в процессе исполнения могут иметь место ошибки загрузчика classloader.
Один из методов для корректировки проблем classloader состоит в добавлении параметров hidden-classes в план развертывания после параметра <moduleId>. Параметр hidden-classes специфицируют имена классов, которые не подлежат загрузке из родительских конфигураций. На листинге 19 показан пример файла geronimo-web.xml для нейтрализации проблем с загрузчиком Axis classloader. Для данного приложения используется файл axis.jar в каталоге WEB-INF\lib.
Листинг 19. Код hidden-classes для нейтрализации проблем с загрузчиком Axis classloader
</moduleId>
<hidden-classes>
<filter>org.apache.axis2<filter>
</hidden-classes> |
Другой метод нейтрализации проблем с загрузчиком classloader состоит в добавлении параметра inverse-classloading в план развертывания после параметра <moduleId>. Обратный порядок загрузки классов (Inverse classloading) заставляет Community Edition следовать иерархии classloader, согласно которой классы от родителя загружаются немедленно после классов приложения из каталога WEB-INF\lib. На листинге 20 показан пример файла geronimo-web.xml с параметрами inverse-classloading.
Листинг 20. Код inverse-classloading для нейтрализации проблем с загрузчиком classloader
</moduleId> <inverse-classloading/> |
Изменение структуры classloader должно обеспечить успешную миграцию приложения. Тем не менее, для работы с компонентами в Community Edition вам придется внести определенные изменения в код приложения, поскольку интеграция и поддержка компонентов – это ключевые преимущества использования Community Edition «поверх» Tomcat. Для получения дополнительной информации ознакомьтесь с документом: Managing the classpath (EN).
Проблемы конфигурирования ресурсов
Такие ресурсы, как соединения с базой данных и с областью безопасности, могут вызвать проблемы в процессе развертывания и исполнения. Поскольку Tomcat имеет иную структуру конфигурирования (с помощью файлов server.xml и context.xml), при миграции в Community Edition могут возникнуть конфигурационные проблемы. В большинстве случаев проблема состоит в некорректности параметра или доступа. Для баз данных в консоли администратора выберите Database Pools - Geronimo database pool wizard для тестирования соединения с базой данных. При нажатии на кнопку Deploy для пула базы данных производится тестирование соединения с указанной базой данных. В случае неудачного соединения происходит ошибка. Вы можете отредактировать пул для изменения параметров и произвести повторное тестирование – и так до тех пор, пока не добьетесь успешного соединения. Для областей безопасности в консоли администратора выберите Security Realms - Add new security realm для тестирования соединения с областью безопасности. Меню мастера Security Realm позволяет ввести имя пользователя/пароль для тестирования соединения. Если попытка входа окончится неудачей, вы можете отредактировать область безопасности и произвести повторное тестирование – и так до тех пор, пока не добьетесь успешного соединения.
План развертывания geronimo-web.xml требует, чтобы определенные параметры и форматы работали корректно. Используемое в данной статье приложение General Store имеет корректный план geronimo-web-xml, включенный в файл ShoppinStore_WASCE.war. Пакет эталонных приложений доступен на сайте загрузки Community Edition (EN). В этот пакет включены приложения различных типов с планом развертывания geronimo-web.xm. Вы можете использовать эти приложения в качестве основы для формулировки требований к своему плану развертывания.
Кроме того, попробуйте использовать меню Plan Creator в консоли администратора для создания плана развертывания geronimo-web.xml на основе WAR-файла Tomcat и соединений с ресурсами (т.е., база данных, JMS, область безопасности), ранее созданных с помощью консоли администратора. Эта достаточно простой метод для создания плана развертывания geronimo-web.xm. После развертывания WAR-файла вы можете определить план развертывания за пределами WAR-файла с помощью поля Plan. На рис. 21 показана информация по развертыванию WAR-файла и внешнего плана развертывания.
Миграция приложений с Tomcat 6.0.x на Community Edition V2.1 является несложной процедурой, поскольку Tomcat 6.0.x фактически является интегрированной, неизмененной частью Community Edition. Тем не менее, поскольку все управление конфигурацией теперь выполняется в Community Edition, элементы конфигурации, обычно расположенные в файлах server.xml или context.xml Tomcat, теперь перенесены в следующие файлы:
- config-substitution.properties: для быстрого изменения таких параметров, как номер порта для коннекторов.
- geronimo-web.xml: специфический для Community Edition план развертывания для контекста приложения; может быть включен в каталог WEB-INF архива
Выполнив процедуру миграции Web-приложения с Tomcat 6.x на WebSphere Application Server Community Edition в пошаговом режиме, мы увидели, что основными моментами этой миграции являются следующие: переключение областей аутентификации, отображение JNDI-ссылок, настройка базы данных Derby, конфигурирование JDBC-коннекторов, фабрик JMS-ресурсов и JMS-очереди JMS.
| Описание | Имя | Размер | Метод загрузки |
|---|---|---|---|
| Web-архив для Tomcat | ShoppingStore_Tomcat.war | 8.9MB | HTTP |
| Web-архив после миграции на Community Edition | ShoppingStore_CommunityEdition.war | 32KB | HTTP |
Научиться
- Оригинал статьи: Migrating from Apache Tomcat Version 6.0.x to WebSphere Application Server Community Edition V2.1 (EN).
- Типовые методики по миграции с Tomcat на Geronimo (EN)
- Новое в версии WebSphere Application Server Community Edition V2.1 (EN)
- Разработка JPA-приложений с помощью WebSphere Application Server Community Edition (EN)
- Сайт поддержки Community Edition (EN)
- Документация по продукту WebSphere Application Server Community Edition (EN)
- Эталонный код WebSphere Application Server Community Edition (EN)
- Сайт Apache Geronimo (EN)
- Разработка приложений с помощью всех API-интерфейсов Java EE5 (EN)
-
Знакомство с Java EE 5 (EN)
- Кластеризация в Community Edition (EN)
- Эталонный код Apache Geronimo (EN)
-
Техническая поддержка продукта WebSphere Application Server Community Edition (EN)
-
Ресурсы по продукту WebSphere Application Server Community Edition (EN)
- Раздел Web-сайта developerWorks, посвященный продуктам с открытым кодом (EN)
Получить продукты и технологии
- Загрузите Community Edition (EN)
- Обновление плагина Eclipse Community Edition (EN)
-
ActiveMQ (EN)
-
Apache Tomcat (EN)
-
OpenEJB (EN)
-
Apache Axis2 (EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- Форум на developerWorks по продуктам WebSphere Application Server Community Edition и Apache Geronimo (EN)
- Форум на Web-сайте developerWorks, посвященный продуктам с открытым кодом (EN)