WebLogic Server に WAR ファイルをデプロイする Ant スクリプト
久々に Ant ネタ。
Eclipse 上で開発しているプロジェクトを WAR ファイルに固めて、WebLogic Server にデプロイする作業を自動化してみる。
以前の記事でも話したが、現場のプログラムは Eclipse の緩いコンパイラに依存しまくっており、javac
が上手くいかなかったので、Eclipse のビルド機能を利用してコンパイルし、WAR ファイルをビルドするようにした。
今回はこの Ant スクリプトでビルドした WAR ファイルを WebLogic にデプロイするまでを Ant スクリプト化した。
Gist で公開
早速だがコードは以下の3ファイル。
build.xml
<?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>
deploy.bat
@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
deploy.xml
<?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.xml
、deploy.bat
、deploy.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.bat
と deploy.xml
は Eclipse 上から叩かないと動かないものではなく、単体でバッチファイルを叩いて呼び出しても使える作りになっている。Eclipse 上で、build.xml
を介して呼べば、deploy.bat
の Pause
コマンドは無視され、全ての処理が続けて行われる。
deploy.xml
について
「WebLogic へのデプロイを行う Ant スクリプト」といきなり紹介したが、コードは「ローカル開発環境の WebLogic を操作する」作りになっている。必要な設定事項は全て property
要素で定義するようにしたので読んでもらえば分かると思うが、必要な設定をすれば別マシンの WebLogic を操作することもできるので、少し解説しておく。
- まず、ローカル開発環境の WebLogic を操作するのであれば、WebLogic を起動した状態で Ant スクリプトを呼ぶこと。この Ant スクリプトは単純に WebLogic 管理コンソールで行う操作を Ant で記述しただけなので、WebLogic が起動していない状態では動作させられない。目安としては
http://localhost:7001/console/
といった URL で管理コンソールにアクセスできる状態になっていれば良い。 - 対象のサーバやアプリケーションは Windows サービス化されていても問題ないが、「初めてデプロイする」アプリケーションは動作しないので注意。
<wls action="redeploy"
というタスクは、名称のとおり ReDeploy (再デプロイ) のタスクなので、初回デプロイは別途行っておく。 - 呼び出すタスクの順番は
Main
ターゲットのとおりだが、サーバを止めて、WAR ファイルをupload
フォルダにコピーして、リデプロイして、サーバを起動させる、この順番を守れれば良い。どれかのタスクでコケたらちゃんとエラーになるので問題ないかと。 <property name="uploadPath" value="C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/upload/${warName}.war"/>
このプロパティはデプロイ時に WAR ファイルをコピーするupload
フォルダを指定しておく。CopyWar
ターゲットでcopy
タスクを使っているとおり、単純に WAR ファイルをコピーできれば良い。
つまり別マシンの WebLogic を操作したい場合は、upload
フォルダを共有フォルダに設定しておき、//192.0.2.0/upload/${warName}.war
といった形でアクセスできるようにしておけば良い。<property name="adminUrl" value="t3://localhost:7001"/>
これはデプロイ先のホストを指定する。http://localhost:7001/console/
といった URL で WebLogic 管理コンソールにアクセスできると思うが、このホストをt3://
という WebLogic 用のプロトコルで指定する。
別マシンの WebLogic 管理コンソールもhttp://192.0.2.0:7001/console/
といった URL でアクセスできるのであれば、t3://192.0.2.0:7001/console/
といった形で指定できる。<property name="userName" value="Neo"/>
<property name="password" value="SomethingPassword"/>
ここは WebLogic 管理コンソールにログインできるユーザ名とパスワードを指定しておく。パスワードが平文で扱われるので本番環境と繋げたい場合はファイルの扱いに注意したい。<property name="target" value="AdminServer"/>
これはデプロイするアプリケーションをデプロイするマシン名を指定する。何もサーバマシンを設定していなければ AdminServer しかないと思うので AdminServer としておいたが、サーバマシンがあればその名称に変更する。<property name="aplName" value="${warName}"/>
これはデプロイするアプリケーションの名前を指定している。この例はアプリケーション名が WAR ファイル名と同じ名前である作りにしている。
環境変数を読み込むために deploy.bat
が分離しちゃってるのが扱いづらいかもなぁ。