WebLogic Server に WAR ファイルをデプロイする Ant スクリプト

久々に Ant ネタ。

Eclipse 上で開発しているプロジェクトを WAR ファイルに固めて、WebLogic Server にデプロイする作業を自動化してみる。

以前の記事でも話したが、現場のプログラムは Eclipse の緩いコンパイラに依存しまくっており、javac が上手くいかなかったので、Eclipse のビルド機能を利用してコンパイルし、WAR ファイルをビルドするようにした。

今回はこの Ant スクリプトでビルドした WAR ファイルを WebLogic にデプロイするまでを Ant スクリプト化した。

Gist で公開

早速だがコードは以下の3ファイル。

<?xml version="1.0" encoding="UTF-8"?>
<project name="TestProject" default="Main" basedir=".">
  
  <!--
    - このファイルがプロジェクトディレクトリの直下に置いてあること
    - project 要素の name 属性値はビルドやリフレッシュを行う対象のプロジェクト名にしておくこと
    - 「外部ツールの構成」→「JRE」タブ→「ランタイム JRE」→「ワークスペースと同じ JRE で実行」を設定しておくこと
  -->
  
  <!-- プロジェクトのディレクトリを絶対パスで指定する (このファイルがプロジェクトディレクトリの直下に置いてあること) -->
  <dirname property="base" file="${ant.file}"/>
  
  <!-- プロジェクト名 (project 要素の name 属性値を使用している・ビルドやリフレッシュを行う対象のプロジェクト名にしておくこと) -->
  <property name="projectName" value="${ant.project.name}"/>
  
  <!-- 生成する WAR ファイル名 -->
  <property name="warName" value="${projectName}"/>
  
  <!-- WAR ファイルのパス : プロジェクトの親ディレクトリにしておく -->
  <property name="warPath" value="${base}/../${warName}.war"/>
  
  <target name="Main" depends="Refresh, Build, CreateWar, CallDeploy" description="WAR ファイルをビルドして WLS にデプロイする">
    <echo message="[${projectName}] Finished."/>
  </target>
  
  <target name="Refresh" description="プロジェクトをリフレッシュする">
    <eclipse.refreshLocal resource="${projectName}" depth="infinite"/>
  </target>
  
  <target name="Build" description="プロジェクトのフルビルド (コンパイル)">
    <eclipse.incrementalBuild project="${projectName}" kind="full"/>
    <!--
      - project 属性
        - 未指定の場合はワークスペースになる
      - kind 属性
        - incremental (デフォルト)
        - full
        - clean
      フルビルドすることで classes ディレクトリに class ファイルがコンパイルされる
      src ディレクトリにある XML ファイルなども classes ディレクトリに格納される
    -->
  </target>
  
  <target name="CreateWar" description="WAR ファイルを作成する">
    <!-- 生成済の WAR ファイルを削除しておく -->
    <delete file="${warPath}" verbose="true"/>
    <!-- WAR ファイルを生成する -->
    <war destfile="${warPath}" webxml="${base}/WEB-INF/web.xml">
      <!-- クラスパスに追加するライブラリのルートディレクトリ -->
      <lib dir="${base}/WEB-INF/lib"/>
      <!-- クラスファイルがあるディレクトリ -->
      <classes dir="${base}/WEB-INF/classes"/>
      <!-- 除外するファイル・ディレクトリの指定 -->
      <fileset dir="${base}">
        <exclude name="*"/>                 <!-- ルート直下のファイルは不要なので除外する -->
        <exclude name="**/.settings/**/*"/> <!-- Eclipse の設定ファイルがあるディレクトリ配下 -->
        <exclude name="**/.settings"/>      <!-- ディレクトリ自体を除外するために記述 -->
        <exclude name="**/src/**/*"/>       <!-- src ディレクトリを除外 (Eclipse 上で生成するとディレクトリツリーが含まれるため) -->
        <exclude name="**/src"/>
        <exclude name="**/work/**/*"/>      <!-- Tomcat が JSP をコンパイルしたものが置かれるディレクトリ -->
        <exclude name="**/work"/>
        <!--
          - .svn ディレクトリなどはデフォルト除外パターンで除外される。
            除外したくない場合は war 要素に defaultexcludes="no" を指定する。
          - /META-INF/MANIFEST.MF がプロジェクトディレクトリ内になくても Ant ビルド時に自動生成される
        -->
      </fileset>
    </war>
  </target>
  
  <target name="CallDeploy" description="WLS へのデプロイを行うバッチ・Ant スクリプトを呼び出す">
    <exec executable="${base}/deploy.bat"/>
    <!--
      WLS へのデプロイを Ant スクリプトから行うには、事前に WLS の情報を環境変数として読み込んでおく必要があるため
      バッチ経由で Ant スクリプトを呼び出す
    -->
  </target>
  
</project>
@Echo Off

Rem WLS へデプロイを行う Ant スクリプトを呼び出すバッチ

Rem 現在の位置をカレントディレクトリに設定する (UNC パスでも実行可能)
Pushd %0/..

Rem デプロイのための WLS の環境変数を読み込む
Call C:/Oracle/Middleware/Oracle_Home/wlserver/server/bin/setWLSEnv.cmd

Rem WLS へのデプロイを行う Ant スクリプト (deploy.xml の Main タスク) を呼び出す
Call Ant -f deploy.xml Main

Rem 終了
Pause
Exit /b
<?xml version="1.0" encoding="UTF-8"?>
<project name="TestProject" default="Main" basedir=".">
  
  <!--
    - このファイルがプロジェクトディレクトリの直下に置いてあること
    - setWLSEnv.cmd を読み込み済みのターミナル上で本タスクを実行すること
  -->
  
  <!-- プロジェクトのディレクトリを絶対パスで指定する (このファイルがプロジェクトディレクトリの直下に置いてあること) -->
  <dirname property="base" file="${ant.file}"/>
  
  <!-- プロジェクト名 (project 要素の name 属性値を使用している・デプロイを行う対象のプロジェクト名にする) -->
  <property name="projectName" value="${ant.project.name}"/>
  
  <!-- デプロイする WAR ファイル名 -->
  <property name="warName" value="${projectName}"/>
  
  <!-- WAR ファイルのパス : プロジェクトの親ディレクトリにしておく -->
  <property name="warPath" value="${base}/../${warName}.war"/>
  
  <!-- WLS アップロード先のフルパス -->
  <property name="uploadPath" value="C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/upload/${warName}.war"/>
  
  <!-- WLS デプロイ先ホスト -->
  <property name="adminUrl" value="t3://localhost:7001"/>
  
  <!-- WLS ログインユーザ名 -->
  <property name="userName" value="Neo"/>
  
  <!-- WLS ログインパスワード -->
  <property name="password" value="SomethingPassword"/>
  
  <!-- WLS デプロイ先サーバ名 -->
  <property name="target" value="AdminServer"/>
  
  <!-- WLS アプリ名 -->
  <property name="aplName" value="${warName}"/>
  
  <!-- WLS のデプロイ用コマンドを wls 要素として定義する -->
  <taskdef name="wls" classname="weblogic.ant.taskdefs.management.WLDeploy"/>
  
  <target name="Main" depends="StopServer, CopyWar, Deploy, StartServer" description="WAR ファイルをデプロイする">
    <echo message="[${projectName}] Finished."/>
  </target>
  
  <target name="StopServer" description="アプリケーションサーバを停止する">
    <wls action="stop" verbose="true" debug="true"
         adminurl="${adminUrl}" user="${userName}" password="${password}" targets="${target}" name="${aplName}"/>
  </target>
  
  <target name="CopyWar" description="WAR ファイルをデプロイ用ディレクトリへコピーする">
    <copy file="${warPath}" tofile="${uploadPath}" preservelastmodified="true" overwrite="true" verbose="true"/>
  </target>
  
  <target name="Deploy" description="WAR ファイルをデプロイする">
    <wls action="redeploy" verbose="true" debug="true"
         adminurl="${adminUrl}" user="${userName}" password="${password}" targets="${target}" name="${aplName}" source="${uploadPath}"/>
  </target>
  
  <target name="StartServer" description="アプリケーションサーバを起動する">
    <wls action="start" verbose="true" debug="true"
         adminurl="${adminUrl}" user="${userName}" password="${password}" targets="${target}" name="${aplName}"/>
  </target>
  
</project>

ファイルの解説と使い方

この build.xmldeploy.batdeploy.xml の3ファイルを、ビルド・デプロイを行いたいプロジェクト直下に配置しておく。

build.xml は、上述の記事で紹介した WAR ファイルビルドを行う Ant スクリプト。Eclipse 上から起動すること。これでワークスペース直下、指定のプロジェクトフォルダと同じ階層に WAR ファイルをビルドして配置する。デプロイ処理については、exec 要素から deploy.bat を実行して行う。

deploy.bat は、deploy.xml を動作させるために呼び出す必要があるバッチスクリプトファイル。WebLogic のインストール先フォルダにある setWLSEnv.cmd を読み込み、WebLogic を操作するのに必要な環境変数を設定させ、それから deploy.xml を Ant 実行する。

deploy.xml は、WebLogic サーバの停止・起動・再デプロイなどを行う Ant スクリプト。<taskdef name="wls" で WebLogic を操作するタスクを定義している。このファイルの詳しい説明は後述。

deploy.batdeploy.xml は Eclipse 上から叩かないと動かないものではなく、単体でバッチファイルを叩いて呼び出しても使える作りになっている。Eclipse 上で、build.xml を介して呼べば、deploy.batPause コマンドは無視され、全ての処理が続けて行われる。

deploy.xml について

「WebLogic へのデプロイを行う Ant スクリプト」といきなり紹介したが、コードは「ローカル開発環境の WebLogic を操作する」作りになっている。必要な設定事項は全て property 要素で定義するようにしたので読んでもらえば分かると思うが、必要な設定をすれば別マシンの WebLogic を操作することもできるので、少し解説しておく。

環境変数を読み込むために deploy.bat が分離しちゃってるのが扱いづらいかもなぁ。