以前、 Java/Maven3/Eclipse上でサクサクWeb開発 (例:tomcat-maven-plugin) でtomcat-maven-pluginを使ってEclipse上からTomcatを起動してサクサク開発環境を試してみました。
今回は純粋にdeployに絞り、様々なJavaEEサーバに対応しているcodehausのcargoを試してみます。
環境:
Win7 32bit JDK6 Maven 3.0.4 Tomcat 6.0.35 conf/tomcat-users.xml: <role rolename="manager-script"/> <user username="tomcat" password="tomcat" roles="manager-script"/>
※tomcat-users.xmlで一般的に良く使われるmanager-gui roleは"/manager/html"のブラウザ画面用のroleです。今回紹介するtomcat-maven-pluginおよびcargoは両方共テキストベースのmanager機能を使うため、manager-scriptのroleでユーザを用意しておく必要があります。
Java/Maven3/Eclipse上でサクサクWeb開発 (例:tomcat-maven-plugin) で作成したサンプルコードを流用します。codehausのsnapshotリポジトリ情報を追加したpom.xmlに、以下のconfigurationを追加します。
<build> <plugins> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.2-SNAPSHOT</version> <configuration> <url>http://localhost:8080/manager</url> <username>tomcat</username> <password>tomcat</password> <update>true</update> <path>/foo</path> </configuration> </plugin> ... </plugins> </build>
Let's deploy!!
mvn tomcat:deploy
"<update>"については古いwarを一旦配備解除(undeploy)してからdeployして欲しいのでtrueにしてます。
これを省略したりデフォルトのfalseのままにしておくと、2度目のdeployで
[ERROR] Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.2-SNAPSHOT:deploy (default-cli) on project tomcat-maven-plugin-test: Cannot invoke Tomcat manager: FAIL - アプリケーションは、既にパス / に存在します -> [Help 1]
とERRORになってしまいます。
"tomcat:redeploy"を使えば、"<update>"がtrueがデフォルトになりますので"<update>"の指定は不要になります。
多分deployするまえにちゃんと行儀よくundeployしてあげればfalseのままでも大丈夫だと思います。
また今回はアプリのpom.xmlの方にTomcatのmanagerのusernameとpasswordを入れてますが、外出しにするのであればセオリー通りにsettings.xmlに
<servers> <server> <id>tomcat-6.0.35-localhost</id> <username>tomcat</username> <password>tomcat</password> </server> </servers>
のように書いておき、アプリのpom.xmlでは
<configuration> <url>http://localhost:8080/manager/html</url> <server>tomcat-6.0.35-localhost</server> <path>/foo</path> </configuration>
としておけばOKです。
なお、あまり無いと思いますが"/"にdeployしたい場合は
<path>/</path>
でOKです。
参考:
codehausのcargoは、様々なJavaEEサーバに対応したdeployを実現してくれるMavenプラグインです。
Jetty, Tomcat, Glassfish, JBoss WebLogicなどオープンソースから商用まで対応しています。
今回はcargoを使ったリモートdeployを試してみます。
サンプルコードですが、cargo側で「リモートサーバへのdeploy用詰め合わせarchetype」を提供してくれていますので、素直にそれを使ってみます。
mvn archetype:generate -B \ -DarchetypeGroupId=org.codehaus.cargo \ -DarchetypeArtifactId=cargo-archetype-remote-deployment \ -DarchetypeVersion=1.2.2 \ -DgroupId=cargo-deploy-test \ -DartifactId=cargo-deploy-test \ -Dversion=1.0-SNAPSHOT \ -Dpackage=test.cargo.deploy
cargo提供のarchetype:
pom.xmlをみてみると、Jetty/Tomcat/JBossなど向けに予めひと通りのprofileが設定済みです。mvn実行時に"-P"でprofileを指定すればよいだけになってます。
カスタマイズが必要な箇所はホスト名・ポート番号・deploy用のusername,passwordを設定しているpropertyだけです。今回はlocalhost:8080でTomcat6.0.35を起動済みですので、あとはusernameとpasswordを以下のように修正します。
<properties> ... <servlet.port>8080</servlet.port> <hostname>localhost</hostname> <username>tomcat</username> <password>tomcat</password> </properties>
Contextについては既に以下のように"${project.artifactId}"に設定済みでした。
<build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.2.2</version> <configuration> <container> <type>remote</type> </container> <configuration> <type>runtime</type> <properties> <cargo.hostname>${hostname}</cargo.hostname> <cargo.servlet.port>${servlet.port}</cargo.servlet.port> <cargo.remote.username>${username}</cargo.remote.username> <cargo.remote.password>${password}</cargo.remote.password> </properties> </configuration> <deployer> <deployables> <deployable> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <type>war</type> <properties> <context>${project.artifactId}</context> </properties>
では、(他のprofileが余計であればさっくり削除して)deployしてみましょう。なおarchetype提供のpom.xml中の、他のprofileを残している場合は"-P tomcat6x"などでprofileを指定するのを忘れずに。
mvn clean verify
cargo提供の"cargo-archetype-remote-deployment" archetypeでは、上記コマンドで結合テスト前にdeploy、結合テスト(index.jspを叩いてみて200が返されるか確認)実行、結合テスト後にundeployまでをしてくれるように設定済みです。
単純にdeploy/undeploy/redeployするだけであれば以下のgoalを指定します。
mvn cargo:deploy mvn cargo:undeploy mvn cargo:redeploy
なお、あまり無いと思いますが"/"以下に配備したい場合は<deployable>の<properties>で<context>に"/"を指定します。
<properties> <context>/</context> </properties>
参考:
使い分けですが、warファイルをdeployするだけであれば対応コンテナの多さからcargoの圧勝です。ただしcargoを使ってMaven + Eclipseでシームレスにデバッグ実行やサクサク開発を実現できるかは不明です。それが実現できるのであれば、わざわざsnapshotリポジトリを指定する必要のあるtomcat-maven-pluginではなく、cargoでそのまま開発~deployまでを担当させることが可能となります。今回はそこまで調べきれませんでした・・・。
今のところは開発時のデバッグはtomcat-maven-plugin, Jenkinsなどdeployではcargo、という使い分けでしょうか。将来的にはcargoの一人勝ちになるかもしれません。
コメント