вторник, 1 декабря 2009 г.

Apache Maven2 – средство для сборки проектов

В данной статье, я постараюсь описать основные возможности Apache Maven2 – средства которое значительно облегчает разработку, как простых проектов, так и сложных, многомодульных проектов над которыми работают несколько команд разработчиков.

Читать далее...

Apache Ant сборка без проблем

О работоспособности муравья сложено не мало сказок и басен… но в данной статье речь пойдет о Apache Ant – не менее работоспособной и гибкой утилиты для сборки проектов.


Читать далее...

воскресенье, 23 августа 2009 г.

Установка и настройка java

Эта статья посвящена новичкам в java программировании, для тех кто собирается влиться в этот увлекательный мир программирования на java, мир полный разнообразных, постоянно развивающихся технологий и готовых средств с огромным, растущим числом приверженцев java.


Как и обещал статья по установки jdk.

Ну от слов к делу

Для изучения любого языка программирования нам необходимо иметь его компилятор (или интерпретатор) для выполнения примеров и тестов, потому как, по моему мнению, на голой теории далеко не уедешь. Прошли те времена когда студенты, изучающие программирования, писали свои коды на бумажке и по долгу смотрели на них, кто то любуясь, кто то старался выполнить их в «мозгу», для того чтобы потом при долгой компиляции не возникло ошибки! :). Ну теперь, слава Богу, все гораздо проще.

И так для начала скачиваем компилятор, который входит состав JDK (Java Development Kit), своего рода «Кит» для разработки на java. Версия JDK постоянно меняется, на момент написания статьи была 1.6.0-b105. Так как java это мульти-платформенный язык программирования для выполнения программ нам необходимо установить JVM (Java Virtual Machine), для определенной ОС (Windows, Linux, Mac и тд), которая в свою очередь входит в состав JDK и устанавливается автоматически вместе с установкой JDK.
Полный список ОС для которых есть версия JDK можно посмотреть на сайте SUN – основного «создателя языка» :).

После запуска инсталляции появится окно, показанное на рисунке 1 в котором необходимо ознакомится с лицензией и нажать кнопку «Accept»


Рисунок 1.

Далее появится окно (рисунок 2) в котором необходимо указать путь установки JDK, для этого необходимо на жать на кнопку «Change…» и в появившемся диалоговом окне выбрать путь: c:\opt\java


Рисунок 2.

После выбора директории нажмите кнопку «Next >». Далее последует процесс инсталляции JDK.

Переменные окружения

Теперь, для возможности вызова компилятора в командной строке, необходимо прописать пути в переменных окружения JAVA_HOME и PATH

Windows:

set JAVA_HOME=c:\opt\java
set PATH=%JAVA_HOME%\bin;%PATH%
Unix/Linux:

set JAVA_HOME=/opt/java
set PATH=$JAVA_HOME/bin:$PATH

Для проверки правильность установки переменных окружения выполните в консоли следующую комманду:

>java -version

Результат должен быть примерно такой

java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing)

Ссылки:
Дистрибутив JDK: http://java.sun.com/javase/downloads/index.jsp
Документация по Java: http://java.sun.com/javase/reference/tutorials.jsp

Читать далее...

суббота, 22 августа 2009 г.

Apache Axis2 – пример использования

Что такое «Ось» - палка от колес, а если в контексте механизма Web-сервисов, это Axis2 (Axis – ось eng.). Проект прославленной группы разработчиков Apache или «Java-образная» реализация Фреймворка технологии Web-сервисов. В данной статье, я хочу, на примере использования, показать способ разработки приложений с Web-сервисной архитектурой.



В предыдущей статье Что такое web-сервисы и с чем их едят, я попытался показать и описать механизм взаимодействия приложений по средствам клиент-серверной технологии - Web-сервисов. Теперь для более детального изучения этого «механизма», я хочу привести пример интеграции приложения, а точнее двух приложений: клиента и сервера, по средствам web-cервис движка или можно сказать сервера - Apache Axis2.

Судя по названию сервера это второе поколение продукта от Apache основанное на наработках при создании первого Axis 1.0, но с совершенно отличающейся архитектурой.


Необходимые инструменты

И так для работы нам понадобится:
jdk-1.5 (или выше)
Web-север Tomcat 6.0– http://tomcat.apache.org/download-60.cgi
Axis2 1.3 - http://ws.apache.org/axis2/download.cgi
Ant 1.6.5 - http://ant.apache.org/bindownload.cgi


Так как мы собираемся написать java приложение, соответственно нам необходимо иметь установленную и настроенную JDK. При написания статьи я использовал JDK версии 1.5.0_10. Процесс установки и настройки java в системе описан мною, в соответствующей статье Установка и настройка java.


Axis2 является серверным приложением, поэтому его можно запускать в отдельном процессе, но так как в большинстве случаев web-сервис архитектура связанна с нагрузками и требует кластеризации и маршрутизации(процесс разделения нагрузок на сервер), по этому его (Axis2) разворачивают как web-приложение на севере приложений EAS (Enterprise Application Server), в данном случае для простоты будем использовать Apache Tomcat 6.0.
Процесс установки и настройки Tomcat web-севера, описан мною, в соответствующей статье Установка и Tomcat web-сервера.

Установка Axis2 как web-приложение

Распаковав загруженный архив, мы получим следующую структуру каталога.

Рисунок 1.
В Папке «dist» находится файл «axis2.war» - это и есть web-приложение Axis2. Его необходимо развернуть на web-сервере, в нашем случае это Tomcat, для этого можно просто скопировать этот файл в папку "<TOMCAT_HOME>/webapps", Tomcat сам определит и развернет приложение.

В результате в списке web-приложение сервера Tomcat (http://[host]:[port]/manager/html)
появится новое приложение axis2


Рисунок 2.

Обзор web-интерфейса Axis2

На первой странице web-интерфейса сервера Axis2, размещены ссылки на три основные страницы основные


Рисунок 3.

Services – Список сервисов которые развернуты на сервере.


Рисунок 4.

По умолчанию в качестве примера сервиса используется сервис, который возвращает версию сервера - Version.


Validate – Страница с результатами проверки системы на наличие необходимых
библиотек и общей статистической информацией о системе.

Administration – Собственно, интерфейс администратора

Для входа в панель администратора необходимо авторизоваться


Рисунок 5.

По умолчанию имя пользователя – admin, пароль пользователя – axis2
Эти значения можно поменять, отредактировав секции

<parameter name="userName">admin</parameter>
<parameter name="password">axis2</parameter>

В файле "<TOMCAT_HOME>\webapps\axis2\WEB-INF\conf\axis2.xml"
Каркас сервиса

И так, настало время написать каркас нашего сервиса.

При разработке данного примера я использовал в качестве сборщика очень удобную утилиту – Ant, это утилита написанная на java для организации процесса сборки java приложений и не только. Очень удобная вещь, постараюсь рассказать о ней позже в следующей статье.

И так наш проект имеет следующую структуру:


Рисунок 6.

Это не эталон, структуру можно поменять, по своему усмотрению, с соответственными изменениями в скриптах сборки.

Как можно догадаться по названию папок:
build – откомпилированный код
dist – архив сборки
lib – необходимые библиотеки
src – исходные коды
build.xml – скрипт для сборки проекта

И так перейдем к исходным кодам.

Сначала создадим класс SimpleService, в пакете my.services
package my.services;

public class SimpleService {
public String sayHello() {

return "Hello World!!!";
}
}

Как видно из листинга это простой класс с одним методом sayHello, который возвращает строку со значением «Hello World!!!» :)

Теперь для того чтобы указать Axis2 серверу, что это у нас web-сервис, необходимо создать xml дескриптор описывающий наш сервис. Для этого создадим папку META-INF
в папке src и создадим в папке META-INF файл services.xml со следующим содержимым.
<service name="SimpleService">
<description>
This service is to say the Hello World
</description>
<parameter name="ServiceClass" locked="false">my.services.SimpleService</parameter>
</service>


Судя по названиям узлов в файле, можно сразу догадаться:

<service>…</service> – секция описания сервиса
name=”SimpleService” - имя нашего сервиса

<description>…</description> - это описание сервиса, полезно заполнять это поле для будущих пользователей сервиса

<parameter name="ServiceClass" locked="false">my.services.SimpleService</parameter> - собственно имя класса с указанием антиблокировки :)

Файл дескриптора может содержать и другие секции, но об этом позже.


Сборка сервиса
После создания xml дескриптора и написания функционала, нам необходимо собрать проект, для этого, как я уже сказал выше, будем использовать Ant.

Весь процесс сборки с помощью Ant основывается на определении целей (правил) сборки в xml файле – build.xml. ниже я приведу пример такого файла с подробными комментариями внутри.
<project name="SimpleAxis2" basedir="." default="aar.server">
<!-- Определяем необходимые параметры-->
<!—Директории -->
<property name="src.dir" value="${basedir}/src" />
<property name="build.dir" value="${basedir}/build" />
<property name="dist.dir" value="${basedir}/dist" />
<property name="lib.dir" value="${basedir}/lib" />
<property name="axis2.home" value="C:\apache.jakarta\axis2" />

<!-- Web Service Name -->
<property name="service.name" value="SimpleService" />
<!-- Web Service Namespace -->
<property name="service.namespace" value="http://services.my" />
<!-- Web Service Data Namespace -->
<property name="services.data.namespace" value="http://data.example.second.axis2.my" />
<!-- Java Package Name -->
<property name="service.java.packageName" value="my.services" />
<!-- Name of Java Implementation Class-->
<property name="service.java.name" value="SimpleService" />
<!-- Java Class Name with Package Information-->
<property name="service.class" value="${service.java.packageName}.${service.java.name}" />
<!-- WSDL file name -->
<property name="service.wsdl" value="${service.name}.wsdl" />


<!-- CLASSPATH -->
<path id="classpath">
<!-- Moved from Java 2 Wsdl -->
<pathelement location="${build.dir}" />
<fileset dir="${axis2.home}\lib">
<include name="*.jar" />
</fileset>
</path>
<property name="axis2.classpath" value="classpath" />

<!-- Очищаем директории  -->
<target name="clean">
<delete dir="${build.dir}" />
</target>

<!-- Компилируем исходные коды -->
<target name="compile" depends="clean">
<mkdir dir="${build.dir}" />

<!--First let's compile the classes-->
<javac debug="on" fork="true" destdir="${build.dir}" srcdir="${basedir}/src" classpathref="classpath">
</javac>
</target>

<!-- Создаем архив сервиса -->
<target name="aar.server" depends="compile">
<mkdir dir="${build.dir}/META-INF" />
<mkdir dir="${build.dir}/lib" />
<!--copy file="${build.lib}/${xbeans.packaged.jar.name}" toDir="${build.classes}/lib" /-->
<copy toDir="${build.dir}/META-INF">
<fileset dir="${src.dir}/META-INF" />
</copy>
<jar destfile="${dist.dir}/${service.name}.aar">
<fileset dir="${build.dir}"/>
</jar>
</target>
</project>

Файл build.xml должен находится в корне проекта (те на одном уровне с папками src и build)

Теперь для сборки проекта в командной строке, необходимо выполнить след команду.

> ant

Ant сборщик автоматически подхватит файл build.xml и основываясь на его целях (правилах) соберет проект.

Развертывание на сервере

Теперь после сборки проекта в папке dist должен появится файл-архив с со всеми необходимыми файлами для сервиса
Для развертывания его на Axis сервере, необходимо скопировать его в папку
"<TOMCAT_HOME>\webapps\axis2\WEB-INF\services\"
Axis сервер, автоматически определит его и развернет в своем контейнере.

Результат можно увидеть на странице
http://localhost:8080/axis2/services/listServices
(для локального сервера)


Рисунок 7.
Как видно на рисунке, в списке развернутых сервисов, появился наш сервис «SimpleService» с одним методом sayHello.


В следующей статье я планирую описать процесс создания клиента для нашего SimpleService.

Жду ваших отзывов и предложений.




Читать далее...

четверг, 20 августа 2009 г.

Что такое web-сервисы и с чем их едят

Проблема интеграции "разношерстных" приложений волнует программистов не один десяток лет. Было создано огромное количество технологий и средств, для решения этой проблемы, одно из этих решений это технология Web-сервисов. В данной статье хочу просто и доступно рассказать, а возможно и показать, что же это за штука такая - web-сервис.


Web-сервисы (web-службы) это одна из клиент-серверных технологий, которая позволяет приложениям взаимодействовать друг с другом независимо от платформы, на которой они развернуты, от языка программирования, на котором они написаны. По сути это набор интерфейсов, которые описывают набор операций (функций), которые могут быть вызваны удаленно по сети, использую стандартизированные XML сообщения.


Всегда, для лучшего понимания я люблю использовать примеры, как говориться: - «на примерах учимся».

Примеры использования

Допустим нам, необходимо получать какие либо данные, которые находятся удаленно по сети. Это могут быть данные из БД ,или это данные из приложения, которое написано на другом, в отличии от нашего приложения, языке программирования, или это данные из закрытой системы. Либо мы хотим передавать (транслировать), данные сторонним приложениям, как говориться - предоставлять сервисы, то есть давать возможность выполнять какие либо операции на своем сервере приложений.


Простейшие примеры из жизни, это сервисы погоды, или сервисы курсов валют, которые мы можем использовать в своих системах.

Схема взаимодействия

Рисунок 1.

На рисунке 1 схематично показан процесс взаимодействия двух приложений.
где, WSDL - (Web Services Description Language) Язык описания внешних интерфейсов web-сервисов, на базе XML.
SOAP - (Simple Object Access Protocol) Протокол обмена сообщениями на базе XML.


Если нам необходимо предоставить возможность вызова наших методов (функции процедуры), сторонними программными средствами нам необходимо описать их с помощью WSDL.
После этого необходимо зарегистрировать (грубо говоря - опубликовать) эти методы на сервере приложений. Где под термином «сервер приложений» - подразумевается, комплекс программных средств для организации выполнения пользовательских программных модулей. Примерами данного сервера может служить простой web-сервер
Apache или web-сервер Tomcat.


Теперь более детально схему работы можно представить в следующем виде


Рисунок 2.

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


Обычно все «общение» происходит на базе протокола HTTP.

Краткое введение в язык WSDL.

По сути WSDL-описание это XML документ с определенной структурой.

Каждый документ WSDL можно разбить на три логические части:

  1. определение типов данных — определение вида отправляемых и получаемых сервисом XML сообщений

  2. абстрактные операции — список операций, которые могут быть выполнены с сообщениями

  3. связывание сервисов — способ, которым сообщение будет доставлено
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.example.org/NewWSDLFile/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NewWSDLFile"
targetNamespace="http://www.example.org/NewWSDLFile/">
<wsdl:types>
<xsd:schema
targetNamespace="http://www.example.org/NewWSDLFile/">
<xsd:element name="NewOperation">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="NewOperationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="NewOperationRequest">
<wsdl:part element="tns:NewOperation" name="parameters" />
</wsdl:message>
<wsdl:message name="NewOperationResponse">
<wsdl:part element="tns:NewOperationResponse" name="parameters" />
</wsdl:message>
<wsdl:portType name="NewWSDLFile">
<wsdl:operation name="NewOperation">
<wsdl:input message="tns:NewOperationRequest" />
<wsdl:output message="tns:NewOperationResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="NewWSDLFileSOAP" type="tns:NewWSDLFile">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="NewOperation">
<soap:operation
soapAction="http://www.example.org/NewWSDLFile/NewOperation" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="NewWSDLFile">
<wsdl:port binding="tns:NewWSDLFileSOAP"
name="NewWSDLFileSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Как видно из примера в начале документа идет секция описания типов.
<wsdl:types>
<xsd:schema
targetNamespace="http://www.example.org/NewWSDLFile/">
<xsd:element name="NewOperation">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="NewOperationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>

В которой объявляются два элемента со своими комплексными типами
Это «NewOperation» и «NewOperationResponse».

<wsdl:message name="NewOperationRequest">
<wsdl:part element="tns:NewOperation" name="parameters" />
</wsdl:message>
<wsdl:message name="NewOperationResponse">
<wsdl:part element="tns:NewOperationResponse" name="parameters" />
</wsdl:message>
В данной секции мы описали сообщения:
NewOperationRequest – запрос
NewOperationResponse – ответ
Сославшись на выше определенные элементы.
<wsdl:portType name="NewWSDLFile">
<wsdl:operation name="NewOperation">
<wsdl:input message="tns:NewOperationRequest" />
<wsdl:output message="tns:NewOperationResponse" />
</wsdl:operation>
</wsdl:portType>

Тут описан «порт» с методом - NewOperation.
<wsdl:binding name="NewWSDLFileSOAP" type="tns:NewWSDLFile">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="NewOperation">
<soap:operation
soapAction="http://www.example.org/NewWSDLFile/NewOperation" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

Затем мы его связали с протоколом SOAP, указав при этом что тип пакетов SOAP – document и тип сообщений (входящих.исходящих) будит – literal и событие по которому будет вызываться метод - http://www.example.org/NewWSDLFile/NewOperation.
<wsdl:service name="NewWSDLFile">
<wsdl:port binding="tns:NewWSDLFileSOAP"
name="NewWSDLFileSOAP">
<soap:address location="http://www.example.org/" />
</wsdl:port>
</wsdl:service>



Ну и собственно сам сервис, который связан с «портом»

Для более подробной информации о языке описания внешних интерфейсов web-сервисов можно посмотреть его спецификацию (http://www.w3.org/TR/wsdl20 или http://www.w3.org/TR/wsdl).

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

В следующей статье я планирую более подробно описать процесс создания сервиса на языке программирования Java.

Полезные ссылки:




Читать далее...

Создание блога

После годовой практики использование в качестве движка для блога Wordpress, решил сэкономить время и деньги за хостинг и завести блог на blogger.com. Хотя прежний проект продолжает жить и его можно лицезреть по адресу alexhustas.net.

А пока планирую разобраться с системой шаблонов и перелить все мои статьи со своего сайта, благо что это на сложно и есть время.

С первого взгляда blogger понравился своей простотой...
Ну... как говорится, все гениальное просто!


Читать далее...