Про то, как написать Ant скрипт для развертывания приложения на сервере приложений Orion Страница 2

Прежде чем перейти к главному файлу сценария развертывания приложения, приведем текст настроечного файла, который будет использовать наш deploy-jar.xml. Этот файл содержит пути к папкам и файлам в конкретной файловой систему и должен быть отредактирован пользователем. Этот файл является так же фильтром для других настроечных файлов. Пример фильтра мы приведем чуть ниже. А сейчас - my.properties:

 orion.home=c:/orion/
 project.dir=.
 prepare.dir=${project.dir}/prepare
 prepare.lib.dir=${prepare.dir}/lib
 build.dir=${project.dir}/bin
 lib.dir=${project.dir}/lib
 properties.dir=${project.dir}/properties

 ear.name=my_application
 ear.file=${project.dir}/${ear.name}.ear

 conf.dir=${project.dir}/conf
 conf.ear.dir=${conf.dir}
 conf.orion.dir=${conf.dir}/orion

 orion.deploy.dir=${orion.home}/applications
 orion.config.dir=${orion.home}/config
 orion.lib.dir=${orion.home}/lib

 log.dir=c:/log

В этом файле параметр log.dir является фильтром для файла my.log4j.properties. В сценарии при обработке my.log4j.properties мы включим директиву filtering="yes" и после этого все строчки вида @log.dir@ в файле my.log4j.properties будут автоматически заменены на значения этого параметра из my.properties файла. То есть в итоге мы получим запись:

до фильтрации:

 log4j.appender.ApplicationServletLog.File = @log.dir@/ApplicationServlet.log

после фильтрации:

 log4j.appender.ApplicationServletLog.File = c:/log/ApplicationServlet.log

Обратите внимение — для того чтобы это произошло и Ant понял какой из настроечных файлов является фильтром — надо произвести настройку таким образом:

 <target name="setup-filters">
  <filter filtersfile="my.properties"/>
 </target>

Алгоритм работы скрипта следующий:

Удаление старой и создание новой временной директории в проекте для подготовки файлов во время выполнения сценария Удаление файлов предыдущей версии проекта на сервере. Чтение настроечного файла Генерация веб модуля(файла myapplication-web.war). Во время генерации происходит создание временной дирекории для веб модуля, создание структуры папок веб модуля, копирование метафайлов, компилирование и копирование классов. Сборка WAR файла. Удаление временной директории для веб модуля. Генерация EJB модуля(файла my_application-ejb.jar). Во время генерации происходит создание временной дирекории для EJB модуля, создание структуры папок EJB модуля, копирование метафайлов, компилирование и копирование классов. Сборка JAR файла. Удаление временной директории для EJB модуля. Генерация EAR файла включая метафайлы. Копирование архива EAR на сервер приложений. Копирование Java библиотек на сервер приложений. Фильтрация настроечных файлов и копирование на сервер приложений.

 

После того, как скрипт отработает, у нас в проекте останется временная папка с содержанием развернутого приложения. Иногда бывает полезно посмотреть что было включено в EAR. Эта папка будет перезаписна при следующем запуске скрипта.

Ниже приведен код самого сценария.

 <!-- Описание скрипта, назначение цели по умолчанию и задание рабочей директории -->
 <project name="myapplicaion-deploy-ear" default="deploy-ear" basedir=".">

  <!-- подключение настроечного файла -->
  <property file="my.properties" />

  <!-- установка фильтра -->
  <target name="setup-filters">
   <filter filtersfile="my.properties"/>
  </target>	

  <!-- цель по умолчанию. перед запуском необходимо чтобы отработали цели clean, setup-filters, generate-ear -->
  <target name="deploy-ear" depends="clean,setup-filters,generate-ear">
   <!-- копируем ear в папку на сервере приложений -->
   <copy overwrite="true" file="${ear.file}" todir="${orion.deploy.dir}" />
   <!-- копируем библиотени на сервер приложений -->
   <copy filtering="no" overwrite="yes" todir="${orion.lib.dir}">
    <fileset dir="${lib.dir}" includes="*.jar" excludes = "orion.jar, ejb.jar" />
   </copy>
   <!-- копируем файлы настройки на сервер приложений -->
   <copy filtering="no" overwrite="yes" todir="${orion.config.dir}">
    <fileset dir="${properties.dir}" includes="*.properties"/>
   </copy>		
  </target>

  <!-- цель для генерации ear файла. перед запуском необходимо чтобы отработали цели generate-wars, generate-jars -->
  <target name="generate-ear" depends="generate-wars, generate-jars" description="Generate ear from the multiple jar files">
   <!-- подготовка EAR метафайлов -->
   <copy filtering="no" overwrite="yes" todir="${prepare.dir}">
    <fileset dir="${conf.ear.dir}" includes = "META-INF/*.xml,persistence/*.txt"/>
   </copy>

   <!-- вызов цели генерации EAR метафайлов -->
   <antcall target="generate-jar">
    <param name="jarfile" value="${ear.file}"/>
    <param name="jarincludes" value="**/*.*"/>
    <param name="jarbasedir" value="${prepare.dir}"/>
   </antcall>
  </target>

  <!-- генерация EJB модуля -->
  <target name="generate-ejb-jar">
   <echo message="Creating jar with EJB" />

   <!-- 1. создание временной директории -->
   <mkdir dir="${prepare.dir}/temp-${modulename}-ejb" />
	
   <!-- 2. копирование метафайлов -->
   <copy filtering="no" todir="${prepare.dir}/temp-${modulename}-ejb">
    <fileset dir="${conf.ear.dir}/myapplication-ejb.jar/" includes="META-INF/*.xml"/>
   </copy>

   <!-- 3. копирование java классов -->
   <copy todir="${prepare.dir}/temp-${modulename}-ejb">
    <fileset dir="${build.dir}" includes="**/*.class" excludes="**/web/**/*.class" />
   </copy>

   <!-- вызов цели генерации EJB модуля -->
   <antcall target="generate-jar">
    <param name="jarfile" value="${prepare.dir}/${modulename}-ejb.jar"/>
    <param name="jarbasedir" value="${prepare.dir}/temp-${modulename}-ejb"/>
    <param name="jarincludes" value="**/*.*"/>
   </antcall>

   <!-- 5. удаление временной директории -->
   <delete dir="${prepare.dir}/temp-${modulename}-ejb" />
  </target>

  <target name="generate-jar">
   <delete file="${jarfile}"/>
   <jar jarfile="${jarfile}" basedir="${jarbasedir}" includes="${jarincludes}"/>
  </target>

  <!-- создание JAR файлов -->
  <target name="generate-jars" depends="create-local-prepare-dir">
   <antcall target="generate-ejb-jar">
    <param name="modulename" value="my_application"/>
   </antcall>
  </target>

  <!-- генерация веб модуля -->
  <target name="generate-war-jar">

   <echo message="Creating war" />

   <!-- 1. создание временной директории -->
   <mkdir dir="${prepare.dir}/temp-${modulename}-web" />

   <!-- 2. копирование метафайлов -->
   <copy filtering="no" overwrite="yes" todir="${prepare.dir}/temp-${modulename}-web">
    <fileset dir="${conf.dir}/myapplication-web.war" includes="**/*.xml"/>
   </copy>

   <!-- 3. копирование java классов -->
   <copy todir="${prepare.dir}/temp-${modulename}-web/WEB-INF/classes">
    <fileset dir="${build.dir}" includes="**/*.class" excludes="**/ejb/**/*.class" />
   </copy>

   <!-- 4. вызов цели генерации WAR модуля -->
   <antcall target="generate-jar">
    <param name="jarfile" value="${prepare.dir}/${modulename}-web.war"/>
    <param name="jarbasedir" value="${prepare.dir}/temp-${modulename}-web"/>
    <param name="jarincludes" value="**/*.*"/>
   </antcall>

   <!-- 5. удаление временной директории -->
   <delete dir="${prepare.dir}/temp-${modulename}-web" />
  </target> 

  <!-- создание WAR файлов -->
  <target name="generate-wars" depends="create-local-prepare-dir">
   <antcall target="generate-war-jar">
    <param name="modulename" value="my_application"/>
   </antcall>		
  </target>

  <!-- подготовка временной директории в проекте -->
  <target name="create-local-prepare-dir">
   <echo message="Create local preparation dir: ${prepare.dir}" />
   <mkdir dir="${prepare.dir}" />
   <mkdir dir="${prepare.lib.dir}" />
  </target>

  <!-- подготовка директории на вервере приложений -->	
  <target name="clean">
   <delete dir="${prepare.dir}" />
   <antcall target="create-local-prepare-dir" />
   <delete file="${orion.deploy.dir}/${ear.file}" />
   <delete dir="${orion.deploy.dir}/${ear.name}" />
   <delete dir="${orion.home}/application-deployments/${ear.name}" />
  </target>
 </project>

Файлы, используемые в статье.

  • Сервер приложений Orion
    Версия 2.0.7 Просто распакуйте его на диск. Желательно чтобы в названиях папок не было пробелов. У нас негативных прецедентов не было.
    Скопируйте в корень Tools.jar из JDK.
  • Упакованное тестовое приложение .zip
    Мы разрабатываем в системе Windows. Так получилось. Это тестовое приложение располагалось в c:/orion/applications. Если Вам необходимо запустить его в Linux/Unix - поменяйте пути. It works.

Страница:

  • 1

  • 2

Александр Смелков
Санкт-Петербург Зима 2007