среда, 20 ноября 2013 г.

Новый механизм экспорта OSB проектов - OSB Offline Configuration Export или configjar

Начиная с версии 11.1.1.7 в состав Oracle Service Bus добавлена утилита для экспорта конфигурации без использования Eclipse. Данная утилита расположена в каталоге OSB_HOME/tools/configjar и позволяет экспортировать настройки шины из исходников в jar-файл для последующего развертывания.

Полная документация по утилите представлена в приложении B. Exporting an Oracle Service Bus Configuration Offline официального руководства Oracle Fusion Middleware Developer's Guide for Oracle Service Bus 11g Release 1 (11.1.1.7). Не вижу смысла пересказывать данное руководство, напишу только об опыте использования утилиты.

Экспортировать конфигурацию с использованием configjar можно из командной строки, Apache Ant и WebLogic Scripting Tool (WLST). В качестве аргумента во всех случаях необходимо передать путь к конфигурационному файлу, содержащему настройки экспорта. Подразумевается, что перед использованием утилиты пользователь выполнит скрипт OSB_HOME/tools/configjar/setenv.bat и тем самым установит нужные переменные окружения, настроит CLASSPATH и подготовит среду к работе. Я же стараюсь писать скрипты сборки таким образом, чтобы они работали без необходимости настраивать окружение. Только build.xml и конфигурационные файлы. Такой перфекционизм создает ряд проблем.

Во-первых, мне не удалось заставить работать команду для Apache Ant - com.bea.alsb.tools.configjar.ant.ConfigJarTask. Данная команда требует установленной переменной окружения weblogic.home. Разобраться как передать значение данной переменной окружения команде не удалось. Однако выход есть - запускать экспорт с помощью команды java, используя класс com.bea.alsb.tools.configjar.ConfigJar:


<java fork="true" 
      dir="${deploy.dir}"
      classname="com.bea.alsb.tools.configjar.ConfigJar"            
      failonerror="true" 
      maxmemory="${osb.export.maxmem}">
    <jvmarg line="-XX:MaxPermSize=256m"/>
    <arg line="-settingsfile ${export.config.file}"/>
    <sysproperty key="weblogic.home" value="${wl.home}"/>
    <sysproperty key="osb.home" value="${osb.home}"/>   
    <sysproperty key="user.language" value="en"/>
    <sysproperty key="user.country" value="US"/>
    <classpath refid="osb_classpath"/>
</java>

Во-вторых, для работы класса com.bea.alsb.tools.configjar.ConfigJar нужно подобрать CLASSPATH. Экспорт удалось настроить, используя следующие классы:


<property name="weblogic.classpath" value="${wl.home}/server/lib"/>
<property name="osb.lib.classpath" value="${osb.home}/lib"/>
<property name="osb.tools.classpath" value="${osb.home}/tools/configjar"/>
<property name="osb.modules.classpath" value="${osb.home}/modules"/>
<property name="osb.soa.modules.classpath" value="${osb.home}/soa/modules"/>
<property name="common.modules.classpath" value="${mw.home}/oracle_common/modules"/>

<path id="osb_classpath">
    <fileset dir="${weblogic.classpath}">
        <include name="weblogic.jar"/>     
    </fileset>
    <fileset dir="${osb.lib.classpath}">
 <include name="alsb.jar"/>   
 <include name="external/log4j_1.2.8.jar"/>
    </fileset>  
    <fileset dir="${osb.modules.classpath}">
 <include name="features/osb.server.modules_11.1.1.7.jar"/>      
    </fileset>  
    <fileset dir="${osb.soa.modules.classpath}">
 <include name="oracle.soa.common.adapters_11.1.1/oracle.soa.common.adapters.jar"/>
    </fileset>  
    <fileset dir="${common.modules.classpath}">
 <include name="oracle.jrf_11.1.1\jrf-api.jar"/>
        <include name="oracle.http_client_11.1.1.jar"/>
 <include name="oracle.xdk_11.1.0\xmlparserv2.jar"/>
 <include name="oracle.webservices_11.1.1\orawsdl.jar"/>
 <include name="oracle.wsm.common_11.1.1\wsm-dependencies.jar"/>   
    </fileset>
    <fileset dir="${osb.tools.classpath}">
 <include name="configjar.jar"/>
 <include name="L10N"/>
    </fileset>
</path>

В-третьих, утилита экспорта может работать в двух режимах: экспорт на уровне проектов и экспорт на уровне отдельных ресурсов. В любом из режимов соответствующие сущности - проекты и ресурсы - требуется явно перечислить. В моей разработке необходимо организовать взаимодействие со многими (более сорока) экземплярами одной и той же информационной системы, при этом используется подход "один проект для взаимодействия с одним экземпляром системы". Получается, что нужно каким-то образом динамически сформировать список проектов для экспорта. Так как файл с настройками экспорта представляет собой XML, то для его формирования идеально подходит технология XSLT, тем более, что Apache Ant ее поддерживает из коробки. Нужно лишь сформировать XML-файл с перечислением проектов и прогнать его через преобразование. За одно можно так же в зависимости от среды (продуктив, разработка, тестирование), для которой осуществляется сборка, указать наименование jar-файла, который будет содержать результаты экспорта.

Исходными данными для формирования списка проектов является свойство projects из файла настроек сборки (например, build.properties). Значением данного свойства являются собираемые проекты, перечисленные через запятую. Наша задача обойти данное перечисление и сформировать XML со списком проектов. Для формирования XML можно использовать команду echo:


<echo message="&lt;projects&gt;" file="${deploy.dir}/projects.xml"/>
<for list="${osb.projects}"
     delimiter=","
     param="project.name">
    <sequential>
        <echo message="&lt;project&gt;@{project.name}&lt;/project&gt;"
       file="${deploy.dir}/projects.xml"
       append="true"/>
    </sequential>
</for>
<echo message="&lt;/projects&gt;" file="${deploy.dir}/projects.xml"
      append="true"/>

Теперь полученный файл со списком проектов можно отправить на XSLT-преобразование. Так же в качестве параметра передадим требуемое имя выходного файла с кодом для шины:


<xslt in="${deploy.dir}/projects.xml"
      out="${export.config.file}"
      style="${deploy.dir}/export.settings.xsl">          
    <param name="exportfile" expression="${osb.export.jar}"/>
</xslt>

Само XSLT-преобразование выглядит следующим образом:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">
    <xsl:param name="exportfile" required="yes" as="xs:string"/>
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="/">
        <configjarSettings xmlns="http://www.bea.com/alsb/tools/configjar/config">
            <source>
                <xsl:for-each select="projects/project">
                    <project>
                        <xsl:attribute name="dir">build/<xsl:value-of select="."/></xsl:attribute>
                    </project>
                </xsl:for-each>    
                <system dir="build/_OSB Integration"/>
            </source>
            <configjar>
                <xsl:attribute name="jar">
                    <xsl:value-of select="$exportfile"/>
                </xsl:attribute>
                <projectLevel includeSystem="true"/>
            </configjar>
        </configjarSettings>
    </xsl:template>
</xsl:stylesheet>

Других проблем при использовании configjar не было.

Субъективные впечатления от новой утилиты исключительно положительные. Описанные выше проблемы тем или иным образом решаются, а кода теперь требует значительно меньше, чем для вызова Eclipse из Apache Ant. Памяти новый процесс сборки потребляет гораздо меньше, а работает быстрее. Экспорт шины, состоящей из 48 проектов и содержащей 954 прокси-, 28 бизнес-сервисов и 2300 XQuery-преобразований осуществляется за две минуты.

Концептуально конечно же завязывать сборку проектов на среду исполнения неверно. Представим себе, что компиляция Java EE-приложения не работала бы без установленного сервера приложений. Гораздо логичнее, когда сборка выполняется с помощью только средства разработки, без привлечения среды исполнения, как в том же IBM WebSphere Message Broker'е. Однако в Oracle Service Bus нельзя установить Eclipse и соответствующие плагины без самой OSB. Тяжелое наследие BEA. В итоге, если раньше человеку, ответственному за сборку, нужно было устанавливать и Eclipse, и OSB, то сейчас достаточно только установить OSB, что дает некоторый выигрыш во времени и числе подготовительных действий. В конце концов можно вообще ничего не устанавливать, а сборку производить на сервере разработки, сгружая туда исходники из SVN.

Понравилось сообщение - подпишитесь на блог

Комментариев нет:

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!