Ant + Tomcat:小さな自動化ルーチン

すべての良い一日。 Ant + Tomcatバンドルでの作業中に発生した小さな自動化ツールに関するメモを書くことにしました。 私はJava開発者として働いていますが、最近、JavaでのWeb開発に没頭しなければなりませんでした(喜んでいないとは言えません) JavaでWebの本格的なプロジェクトに出くわしたことは一度もありません。「少しでもすべて」シリーズのJavaブックのフレームワークの例を数回プレイしましたが、深刻なことはありませんでした。 そして、コンテンツの責任者向けのバックエンド、データベース内の大量のデータを備えた本格的なポータルのプロジェクトです。 まあ、それは何ですか、そうです。 作業が開始され、新しい知識の分野は興味深いものであり、不足しているものはほとんどありません。 しかし、時間の経過とともに、アプリケーションの構築と展開のプロセスは非常に困難になりました。「最も暑い」日には、作業の結果を確認してクリックするためにこの操作を40回実行する必要があったためです。 これは、何らかの方法でこれを自動化できるかどうかという疑問が生じた場所です。



JavaでWebアプリケーションをアセンブルおよびデプロイするプロセスを実際に表していないように、もう少し詳しく説明します。



1.したがって、アプリケーションをアセンブルする必要があります。 これはIDEを介して行うことができますが、複数の開発者とそれぞれが独自のIDEを持つことができる大規模なプロジェクトでは、ANTを普遍的かつ便利に使用することをお勧めします。 そのため、たとえばant jarのようにアセンブリを実行します。 私たちのプロジェクトで平均して1つのjarモジュールをビルドするには、約15〜20秒かかります。 Webアプリケーション自体はwarファイルです(Java SEのjarファイルに似ています)。 しかし、最終的なwarファイルは、他のモジュールのjarファイルにいくつかの依存関係を持つ可能性があります(通常は依存関係があります)。 同様に、最終的なwarファイルが依存するモジュールのコードが変更された場合、最初にモジュールを再構築してから、アプリケーション自体をアセンブルします。 このようなモジュールは2つあります。原則として、作業中、変更は同じモジュール内で行われますが、両方のモジュールをリビルドするか、リビルドするために何も必要ないことがあります(コードが変更された最終戦争を除く)。 通常、1つのモジュールは通常再構築されます。 したがって、コマンドのシーケンスは次のようになります。



 cd { } ant jar cd {  } ant war
      
      





その結果、アプリケーションのwarファイルを取得します。 ディレクトリ間の切り替えを考慮したアセンブリには、50〜60秒かかります。 プロジェクトには2つの最終的な戦争ファイルがあることをすぐに言わなければなりません:公的部分と私的部分、そして総会の命令がありますが、その不便さは、今では「不必要な」「戦争」のアセンブリです-これもまた時間です。



2.アプリケーション自体の動作を確認するには、結果のwarファイルをサーバーに展開する必要があります。 これを行うには、ブラウザからTomcatコントロールパネルに移動し、古いバージョンのアプリケーションを削除し(存在する場合)、新しいwarファイルの場所を指定し、しばらく(40〜60秒)待ちます。その後、作成したアプリケーションの「プローブ」を開始できます。



アプリケーションのアセンブリと展開のおおよその時間を書くのは何の理由もありません-合計で、これらの2つの一見単純な手順には2〜3分かかります。 少し見えますが、頻繁に変更したり、何らかのバグの解決策を見つけたりすると、プロジェクトを何度も再構築し、サーバーから古いバージョンのアプリケーションをアンデプロイ(削除)してから、新しいバージョンのアプリケーションをデプロイ(デプロイ)する必要があります。 1日のうちにこの操作を数回繰り返すことがありますが、上で書いたように、この操作の繰り返しは何十回も発生します。 その結果、このプロセスを最適化するという疑問が生じました。 この操作を10〜20回繰り返すと、30〜60分のコストがかかります。 さて、この時点でコンピューターから注意をそらすことができたとしても、人の密な参加が必要であることがわかります。



まず、antでステップ1を実行するコマンドを1つ追加するというアイデアが生まれました(各戦争ごとに個別に)が、「ステップ2を自動化することは可能ですか?」、つまり、antにTomcatでのアプリケーションの展開を管理する方法を教えるという質問がありました。 グーグルで少し検索してみたところ、いくつかの解決策を見つけ、そこからいくつかの解決策を見つけました。



このユーティリティの参考資料で説明されているように、antでアプリケーションをビルドするプロセスは省略します。さらに、個々のプロジェクトに固有です。 すぐにステップ番号2のソリューションに進みます。



まず、システムにTomcatが存在するかどうかを調べる必要があります:



 <target name="if-has-tomcat"> <property environment="env"/> <condition property="has.tomcat"> <available file="${env.CATALINA_HOME}"/> </condition> </target>
      
      





「if-has-tomcat」タスクを作成します。このタスクの本質は、CATALINA_HOMEシステム変数で指定されたディレクトリの可用性をチェックし、このチェックの結果を「has.tomcat」変数の形式で提示することです。 式property environment="env"



を使用すると、システム変数にアクセスできます。



tomcatがシステム上にあることがわかったので、そのライブラリーを接続できます。これにより、antからtomcatを制御できます。 同時に、ここではサーバーにwarファイルの古いバージョンがあるかどうかを確認します。



 <target name="check-if-deployed" depends="if-has-tomcat" if="has.tomcat"> <property name="tomcat.home.dir" location="${env.CATALINA_HOME}" /> <property name="tomcat.base.url" value="http://localhost:8080" /> <property name="tomcat.manager.url" value="${tomcat.base.url}/manager/text" /> <property name="tomcat.user.name" value="login" /> <property name="tomcat.user.password" value="password" /> <condition property="is.webapp.deployed"> <http url="${tomcat.base.url}/${ant.project.name}" /> </condition> <path id="tomcat.classpath"> <!-- We need the Catalina jars for Tomcat --> <fileset dir="${tomcat.home.dir}/lib"> <include name="catalina-ant.jar"/> <include name="tomcat-coyote.jar"/> <include name="tomcat-util.jar"/> </fileset> <fileset dir="${tomcat.home.dir}/bin"> <include name="tomcat-juli.jar"/> </fileset> </path> <!-- Configure the custom Ant tasks for the Manager application --> <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask" classpathref="tomcat.classpath"/> <taskdef name="list" classname="org.apache.catalina.ant.ListTask" classpathref="tomcat.classpath"/> <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask" classpathref="tomcat.classpath"/> <taskdef name="findleaks" classname="org.apache.catalina.ant.FindLeaksTask" classpathref="tomcat.classpath"/> <taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask" classpathref="tomcat.classpath"/> <taskdef name="start" classname="org.apache.catalina.ant.StartTask" classpathref="tomcat.classpath"/> <taskdef name="stop" classname="org.apache.catalina.ant.StopTask" classpathref="tomcat.classpath"/> <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask" classpathref="tomcat.classpath"/> </target>
      
      





まず、Tomcatを操作するために必要な変数を宣言します。Tomcatホームフォルダー、Tomcat URL、マネージャーURL、ログイン、パスワードです。 次に、アプリケーションが既にホストされているかどうかを確認する条件を作成します(つまり、アプリケーションの新しいバージョンをデプロイする前に、古いバージョンを削除する必要があります)。 ここで、$ {ant.project.name}には、上記で宣言されたアプリケーションの名前が含まれています(この変数はプロジェクトのビルドのタスクに関係しているため、私はantスクリプトのヘッダーで宣言しました)。 次のステップは、antを介してサーバーを管理できるようにするライブラリを接続することです。 最後に-tomcatの管理用にantのタスクを宣言します。



すべてのソースデータがわかったので、warファイルの古いバージョン(存在する場合)を削除し、undeployコマンドと新しいwarファイルをデプロイします-deployコマンド。



 <target name="undeploy" depends="if-has-tomcat, check-if-deployed" if="is.webapp.deployed"> <!-- TOMCAT undeploy--> <undeploy url="${tomcat.manager.url}" username="${tomcat.user.name}" password="${tomcat.user.password}" path="/${ant.project.name}" /> </target> <target name="deploy" depends="clean, war, if-has-tomcat, undeploy" if="has.tomcat"> <!-- TOMCAT deploy--> <deploy url="${tomcat.manager.url}" username="${tomcat.user.name}" password="${tomcat.user.password}" path="/${ant.project.name}" war="${dist.dir}/${ant.project.name}.war" /> </target>
      
      





ここでは、概して、複雑なものは何もありません。 ant deployコマンドが常に使用されます。このコマンドは、クラスファイル(クリーン)ですべてのフォルダーのクリーニングを実行し、warファイル(war)をアセンブルし、tomcat(if-has-tomcat)をチェックし、前のチェックが肯定的な場合にアンデプロイタスクを実行します。 、サーバー上のwarファイルの古いバージョンの存在を確認し、必要に応じてそれを削除します。そして最後に、アプリケーションはサーバーに直接デプロイされます。 展開タスクのwarプロパティは、新しいwarファイルの場所を示しているだけです。



展開と同じ方法で見られるように、展開解除タスクでは、システム内にTomcatが存在するかどうかのチェックが実行されます。 これは、ant undeployコマンドを安全に実行できるようにするためです。



その結果、すべてが1つのコマンド-ant deployによって実行されることが判明しました。 その後、1〜2分間気を散らすことができます-アリはすべて自分でやる 純粋に、アセンブリと展開の時間は同じままでしたが、複数のチームを「手動で」クリックして操作することによるこのプロジェクトの節約は、各展開から1〜1.5分になりました。 1日で20〜30分余分に発生することと最も重要なこと:展開は1つのコマンドの助けを借りて実行され、注意を必要としません。



All Articles