13 июня 2016 г.

Автоматизация сборки Oracle Service Bus 11g

Возникла ситуация, когда потребовалось реализовать локальную модульную (ресурсную) сборку проектов Oracle Service Bus (OSB) из исходных кодов. К сожалению, в интернете нашел статьи только по сборке всех модулей единым артефактом (одна из лучших, на мой взгляд), что не подходило под исходные требования. Поэтому решил поделиться решением данной задачи.

Начиная с версии OSB 11.1.1.7 компания Oracle предоставила разработчикам инструмент configjar, который позволяет собирать артефакты без использования Eclipse (OEPE).

Для реализации модульной сборки решено использовать инструмент configar со сборщиком проектов Maven.
Далее, все действия подразумевают, что OSB и Maven установлены и сконфигурированы в вашей операционной системе, а также настроена переменная окружения PATH для Java и Maven.

Команда запуска инструмента configjar предельно простая:
com.bea.alsb.tools.configjar.ConfigJar -settingsfile /pathToFile/configFileName.xml
В параметрах запуска необходимо передать путь к конфигурационному файлу, который содержит информацию о входных данных.

1. Создание каркаса

Для начала создадим каркас нашей сборки, для этого в рабочей директории (Eclipse workspace) osb проектов необходимо создать следующие ресурсы:
- папку osb-parent, которая будет содержать общие исполнительные файлы для каждого собираемого модуля;
- файл pom.xml, основной исполнительный файл, который будет только описывать список модулей, которых необходимо собрать.
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ru.test</groupId>
    <artifactId>osb</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>

    <name>OSB Test projects</name>

    <modules>
        <!-- external -->
        <module>ExternalBusModules/ExternalProject1</module>
        <module>ExternalBusModules/ExternalProject2</module>
        <!-- internal -->
        <module>InternalBusModules/InternalProject1</module>
        <module>InternalBusModules/InternalProject2</module>
    </modules>
</project>
Главное, на что следует обратить внимание в данном файле, это элемент <modules>, в котором описываются относительные пути модулей проекта, для которых необходимо собрать артефакты.
Обратите внимание, что каждый описанный модуль должен содержать свой pom.xml

2. Создание pom.xml для модулей

После создания каркаса, необходимо для каждого модуля, который необходимо собрать,  и описанном в основном исполнительном файле, создать свой pom.xml, ниже приведен пример такого файла.
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>ru.test</groupId>
        <artifactId>osb-parent</artifactId>
        <!-- Путь к главной исполнительной директории, которая содержит pom.xml с логикой сборки -->
        <relativePath>../../osb-parent</relativePath>
        <version>1.0</version>
    </parent>

    <properties>
        <!-- Название папки проекта, используется при построении структуры артефактов -->
        <modules.dir>BusModules_ext</modules.dir>
        <!-- Постфикс артефакта, используется при именовании -->
        <jar.postfix>_ext</jar.postfix>
    </properties>

    <!-- Название артефакта, используется при именовании -->
    <artifactId>ExternalProject1</artifactId>
    <!-- Версия артефакта, используется при именовании -->
    <version>1.0</version>
    <packaging>pom</packaging>
</project>
Обратите внимание все модули будут ссылаться на главный исполнительный файл pom.xml  в папке osb-parent, который будет выполнять всю логику сборки артефактов.

3. Файл настроек configjar 

Далее необходимо создать шаблон конфигурационного файла для configjar.
Для этого, в папке osb-parent, создадим файл build.xml такого вида:

<configjarSettings xmlns="http://www.bea.com/alsb/tools/configjar/config">
 <source>
  <project dir="$SOURCE_PROJECT$"/>
  <fileset>
   <exclude name="**/config-plans/*"/>
   <exclude name="**/pom.xml"/>
  </fileset>
 </source>

 <configjar jar="$TARGET_PROJECT$">
  <resourceLevel>
   <resources>
    <include name="**/$PROJECT_NAME$/**/*"/>
    <exclude name="**/*.LocationData"/>
   </resources>
  </resourceLevel>
 </configjar>
</configjarSettings>
Константы, окруженные амперсандами, в дальнейшем будут подменяться индивидуальными, для каждого проекта, значениями.

4. Реализация логики сборки артефактов

Теперь самая важная часть, необходимо реализовать логику сборки артефактов в главном исполнительном pom.xml, который расположим папке osb-parent

Для запуска configjar используем плагин exec-maven-plugin, самое важно на этом этапе правильно составить строку classpath, также необходимо передать конфигурационные файл ключом -settingfile. На примере ниже, видно, что classpath вынесен в параметры профиля. Вам необходимо убедиться что все библиотеки указанные библиотеки есть у вас в системе, при необходимости исправить пути к ним. Обратите внимание, что элемент <fmw.home> использует значение переменной окружения FMW_HOME, которая должна быть указана в вашей ОС, либо просто укажите путь в её значениях.

Для подготовки конфигурационного файла используем плагин com.google.code.maven-replacer-plugin, которым в шаблоне build.xml мы будем заменять заранее определенные константы на необходимые нам параметры, полученный файл будем записывать во временную директорию, путь к которой, определим в параметрах. Путь именно к этому файлу будем передавать в качестве значения ключа -settingfile при запуске configjar.
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>ru.test</groupId>
    <artifactId>osb-parent</artifactId>   
    <version>1.0</version>
    <packaging>pom</packaging>

    <profiles>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <fmw.home>${env.FMW_HOME}</fmw.home>
                <weblogic.home>${fmw.home}/wlserver_10.3</weblogic.home>
                <osb.home>${fmw.home}/Oracle_OSB1</osb.home>
                <configjar.home>${osb.home}/tools/configjar</configjar.home>
                <common.components.home>${fmw.home}/oracle_common</common.components.home>
                <!-- for Windows = empty-->
                <java.secure.conf/>
                <exec.classpath>${osb.home}/modules/com.bea.common.configfwk_1.7.0.0.jar;${osb.home}/lib/sb-kernel-api.jar;${osb.home}/lib/alsb.jar;${osb.home}/lib/sb-kernel-wls.jar;${osb.home}/lib/sb-kernel-impl.jar;${fmw.home}/modules/features/weblogic.server.modules_10.3.5.0.jar;${weblogic.home}/server/lib/weblogic.jar;${common.components.home}/modules/oracle.http_client_11.1.1.jar;${common.components.home}/modules/oracle.xdk_11.1.0/xmlparserv2.jar;${common.components.home}/modules/oracle.webservices_11.1.1/orawsdl.jar;${common.components.home}/modules/oracle.wsm.common_11.1.1/wsm-dependencies.jar;${osb.home}/modules/features/osb.server.modules_11.1.1.7.jar;${osb.home}/soa/modules/oracle.soa.common.adapters_11.1.1/oracle.soa.common.adapters.jar;${configjar.home}/configjar.jar;${configjar.home}/L10N;</exec.classpath>
            </properties>
        </profile>

        <profile>
            <id>bamboo</id>
            <properties>
                <fmw.home>${env.FMW_HOME}</fmw.home>
                <weblogic.home>${fmw.home}/wlserver_10.3</weblogic.home>
                <osb.home>${fmw.home}/osb</osb.home>
                <configjar.home>${osb.home}/tools/configjar</configjar.home>
                <common.components.home>${fmw.home}/oracle_common</common.components.home>
                <java.secure.conf>-Djava.security.egd=file:/dev/./urandom</java.secure.conf>
                <exec.classpath>${osb.home}/modules/com.bea.common.configfwk_1.7.0.0.jar:${osb.home}/lib/sb-kernel-api.jar:${osb.home}/lib/alsb.jar:${osb.home}/lib/sb-kernel-wls.jar:${osb.home}/lib/sb-kernel-impl.jar:${fmw.home}/modules/features/weblogic.server.modules_10.3.6.0.jar:${weblogic.home}/server/lib/weblogic.jar:${common.components.home}/modules/oracle.http_client_11.1.1.jar:${common.components.home}/modules/oracle.xdk_11.1.0/xmlparserv2.jar:${common.components.home}/modules/oracle.webservices_11.1.1/orawsdl.jar:${common.components.home}/modules/oracle.wsm.common_11.1.1/wsm-dependencies.jar:${osb.home}/modules/features/osb.server.modules_11.1.1.7.jar:${osb.home}/soa/modules/oracle.soa.common.adapters_11.1.1/oracle.soa.common.adapters.jar:${configjar.home}/configjar.jar:${osb.home}/tools/configjar/L10N:</exec.classpath>
            </properties>
        </profile>
    </profiles>

    <properties>
        <workspace.dir>${project.basedir}/../../</workspace.dir>
        <workspace.temp.dir>${workspace.dir}/.tempdata</workspace.temp.dir>
        <settingfile.path>${workspace.temp.dir}/build.xml</settingfile.path>
        <target.dir>${workspace.dir}/target</target.dir>
        <artifact.target.dir>${target.dir}/${modules.dir}/${project.artifactId}</artifact.target.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
    </properties>

    <build>
        <plugins>

            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${workspace.temp.dir}</directory>
                        </fileset>
                    </filesets>
                </configuration>
                <executions>
                    <execution>
                        <id>auto-clean</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>replacer</artifactId>
                <version>1.5.2</version>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>                    
                    </execution>
                </executions>
                <configuration>
                    <ignoreMissingFile>true</ignoreMissingFile>
                    <file>${workspace.dir}/osb-parent/build.xml</file>
                    <outputFile>${settingfile.path}</outputFile>
                    <regex>false</regex>
                    <replacements>
                        <replacement>
                            <token>$SOURCE_PROJECT$</token>
                            <value>${workspace.dir}/${modules.dir}</value>
                        </replacement>
                        <replacement>
                            <token>$TARGET_PROJECT$</token>
                            <value>${artifact.target.dir}/${project.artifactId}_${project.version}${jar.postfix}.jar</value>
                        </replacement>
                        <replacement>
                            <token>$PROJECT_NAME$</token>
                            <value>${project.artifactId}</value>
                        </replacement>  
                    </replacements>    
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <id>build_external</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <includeProjectDependencies>false</includeProjectDependencies>
                            <includePluginDependencies>false</includePluginDependencies>
                            <workingDirectory>${workspace.temp.dir}</workingDirectory>
                            <executable>java</executable>

                            <commandlineArgs>
                            -Xms128m 
                            -Xmx256m 
                            -XX:MaxPermSize=256m ${java.secure.conf} 
                            -Dosb.home=${osb.home} 
                            -Dweblogic.home=${weblogic.home} 
                            -classpath ${exec.classpath} com.bea.alsb.tools.configjar.ConfigJar -settingsfile ${settingfile.path}
                            </commandlineArgs>          

                            <removeAll>true</removeAll>
                        </configuration>
                    </execution>

                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>generate-test-resources</phase>
                        <configuration>
                            <tasks>
                                <mkdir dir="${artifact.target.dir}"/>
                                <copy todir="${artifact.target.dir}">
                                    <fileset dir="${workspace.dir}/${modules.dir}/${project.artifactId}" includes="config-plans/*" />
                                </copy>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
</project>
Обратите внимание, что classpath под windows должен использовать в качестве разделителя  ';', а под Linux ':'.

Также под Linux, для ускорения сборки на некоторых linux-системах (особенно VM), при запуске configjar, следует использовать ключ:
security.egd=file:/dev/./urandom

5. Запуск сборки

Из рабочего каталога с вашими проектами, где находится pom.xml, который содержит список модулей для сборки, необходимо в консоли запустить
- для сборки артефактов:
mvn package
- для очистки файлов предыдущей сборки:
mvn clean
Для вывода отладочной информации при настройки сборки используйте ключ '-X'.

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

Все примеры, используемые в статье, доступны на github.

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

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