火曜日 8 01, 2006
火曜日 8 01, 2006
Java EEアプリケーション(.earファイル)/モジュール(.warファイル、ejb-jarファイル)をAppServerにデプロイする方法はベンダ毎に異なります。以下に、SJS AppServer 9 (glassfish)の場合のデプロイメントのバリエーションを紹介します。
http://adminhost:port/(通常、http://localhost:4848)にアクセスし、管理者でログイン(通常、ユーザadmin、パスワードadminadmin)した後、「アプリケーション」ノードの適切なモジュールをクリックし、「配備(deploy)」ボタンを押して、モジュールをアップロードします。
おそらく、glassfishをサーバにした場合最も使われない方法だと思います。
モジュールをAppServerのautodeployディレクトリにコピーするだけで、そのモジュールが自動配備される方法です。
# デプロイ時 $ cp calc.jar $ASROOT/domains/domain1/autodeploy/ # アンデプロイ時 $ rm $ASROOT/domains/domain1/autodeploy/calc.jar
修正したモジュールを再デプロイする場合は、autodeployディレクトリのモジュールを上書きコピーすることで、古いモジュールのアンデプロイと新しいモジュールのデプロイが続けて行なわれます。
尚、autodeployディレクトリへのポーリング間隔はデフォルトで2秒になっています。この設定を変更するには、管理コンソール(http://localhost:4848/)にログインし、「アプリケーションサーバ」ノードの「詳細>アプリケーション設定」画面の自動配備設定を変更します。
ファイル・コピーによる自動デプロイの場合、いろいろなモジュールをデプロイ/アンデプロイするうちにautodeployディレクトリにゴミが溜っていきます。それが気になる場合には、glassfishに含まれる管理コマンドasadminを使ってデプロイメントを行なうとよいでしょう。デプロイ時のコマンドはasadmin deploy <ファイル名>、アンデプロイ時のコマンドはasadmin undeploy <モジュール名>です。
# デプロイ時 $ $ASROOT/bin/asadmin deploy calc.jar # アンデプロイ時 $ $ASROOT/bin/asadmin undeploy calc
修正したモジュールを再デプロイする場合は、引続きasadmin deployコマンドを実行すればOKです。オプションとして、ホスト名とポート番号を指定すれば、リモート・ホストからもデプロイできます。
$ $ASROOT/bin/asadmin deploy --host remote.host --port 4848 calc.jar
尚、デプロイ済みのモジュールの一覧を取得するには、asadmin list-componentsコマンドを用います。
$ $ASROOT/bin/asadmin list-components calc <ejb-module> コマンド list-components は正常に実行されました。
glassfishでは、Java EEモジュールを必ずしもアーカイブする必要はなく、Apache Tomcatと同じようにモジュールがディレクトリに展開された状態でもデプロイすることができます。この場合、asadmin deploydir <ディレクトリ名>を使用します[1]。
$ find calc calc calc/com calc/com/example calc/com/example/Calc.class calc/com/example/CalcImpl.class # デプロイ時 $ $ASROOT/bin/asadmin deploydir calc # アンデプロイ時 $ $ASROOT/bin/asadmin undeploy calc
上記の例では、CalcImpl.classに@Statelessアノーテーションが付与されていたため、calcディレクトリはejb-jarモジュールとしてデプロイされます。展開形式でのデプロイは、ejb-jarモジュール、warモジュール、earアプリケーションのいずれの場合でも利用可能です。ただし、展開形式のwarモジュールの場合は、JSPファイルだけのwarモジュールであってもWEB-INF/web.xmlを省略できません。同様に、展開形式のearアプリケーションはearアーカイブでは省略可能であったMETA-INF/application.xmlが省略できないことに注意して下さい。
また、展開形式のデプロイはローカルホストへのデプロイの場合のみ有効です。
モジュール内の一部のファイル(デプロイメント記述子やクラスなど)を更新しただけの場合、Tomcatと同じように更新したファイルだけを置き換えるだけで、そのモジュールを再読み込みさせることができます。これは特にモジュールの開発中に展開形式のデプロイをしている場合に便利です。
ただし、glassfishの場合はTomcatの場合より一手間だけ手順が多く、モジュール名のディレクトリの直下に.reloadというファイルを作成し、その更新日付を変更しなければなりません。UNIXの場合は以下のようにtouchコマンドを利用します。
$ javac com/example/CalcImpl.java -d calc/ # 一部クラスの更新 $ touch calc/.reload # 更新を通知
自動再読み込みは、asadminコマンドによりアーカイブ形式でデプロイした場合でも有効です。この場合は$ASROOT/domains/domain1/application/ディレクトリ配下に展開されている各モジュールのファイルを直接上書きし、上記と同様に.reloadファイルをtouchすればOKです。
尚、JSPを更新した場合だけは、.reloadファイルのtouchは必要ありません。
自動再読み込みのポーリング間隔はデフォルトで2秒です。ポーリング間隔を変更する場合や、プロダクション・サーバ用に自動再読み込みのポーリングそのものを止める場合は、管理コンソール(http://localhost:4848/)にログインし、「アプリケーションサーバ」ノードの「詳細>アプリケーション設定」画面の設定を変更します。
アプリケーションの開発にNetBeansを使用しているのであれば、NetBeansに組み込まれているデプロイヤを使用するのが最も簡単でしょう。NetBeansの場合は、内部では展開形式のデプロイメントが行なわれています。
あくまでも参考情報としてですが、Java EE 5仕様にはJSR-88によって定められたデプロイメントに関する標準APIが含まれています。従って、デプロイメントの処理そのものをJavaのコード(あるいは、Groovyなどのスクリプト言語)で実現することも可能です。通常のアプリケーション開発でJSR-88のDeployment APIを使うことはまずないと思いますが、以下のようなコードを用意することで、asadminコマンドと同様のデプロイメントを行なうことができます。
import java.io.File;
import javax.enterprise.deploy.shared.StateType;
import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.Target;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.factories.DeploymentFactory;
import javax.enterprise.deploy.spi.status.ProgressObject;
public class Deploy {
static String factoryClass =
"com.sun.enterprise.deployapi.SunDeploymentFactory";
static String uri = "deployer:Sun:AppServer::localhost:4848";
public static void main(String args[]) throws Exception {
// DeploymentManagerの取得
DeploymentFactoryManager dfm = DeploymentFactoryManager.getInstance();
DeploymentFactory df =
(DeploymentFactory)Class.forName(factoryClass).newInstance();
dfm.registerDeploymentFactory(df);
DeploymentManager dm =
dfm.getDeploymentManager(uri, "admin", "adminadmin");
// モジュールの転送
Target ts[] = dm.getTargets();
ProgressObject po = dm.distribute(ts, new File("calc.jar"), null);
while (!po.getDeploymentStatus().getState()
.equals(StateType.COMPLETED)) {
try { Thread.sleep(200); } catch (InterruptedException e) {}
}
// モジュールの開始
TargetModuleID ids[] = po.getResultTargetModuleIDs();
po = dm.start(ids);
}
}
他にもantのタスクを利用する方法などもありますが、上記のどれが最適な方法かは断定することはできません。状況に応じて使い分けるのがよいと思います。
参考:
[1] ドキュメントでは、deploydirコマンドを指定するように記述されていますが、実際にはdeployコマンドを指定しても同じように動作するようです。
cool
Posted by wow gold on 11月月 03日, 2008年 at 10:43 午前 JST #