多くの時間と労力を費やした後、私たちはついにMavenを使用して開発用のアプリケーションライフサイクルを管理しています。残念ながら、テスト/ QA /ステージングにデプロイする前に、ANTを使用してEARを構築しています。
私たちはその飛躍を遂げましたが、開発者はコードをテストするために自由に行うことができます。私たちが抱えている問題の1つは、チームの半分がTomcatを使用してテストを行っており、残りの半分がJettyを使用していることです。私はTomcatよりもJettyの方が少し好きですが、他のすべての環境でWASを使用しているにもかかわらずです。
デプロイ先と同じアプリケーションサーバーで開発する必要がありますか?
これらの環境の違いから、数多くのバグが発生しました。 Tomcat、Jetty、およびWASは内部で異なります。私の意見では、私たち全員が本番環境にデプロイするものを開発する必要があるので、問題は発生しません。私のマシンでは問題なく動作しました。私はJettyを好みますが、WASへのデプロイが遅くて面倒であっても、全員が同じ環境で作業していると思います。
あなたのチームのダイナミクスはどのようなものですか?私たちのリード開発者はチームを辞任し、それ以来、開発はすべて無料です。
私の質問は、デプロイ先と同じアプリケーションサーバーで開発する必要があるかどうかです。
まったく同じサーバーではありません。すべてのサーバーが同一であるというばかげたルールを作成した場合、アップグレードや新しいリリースをテストすることはできません。 [何人かの人々は規則を通過させようとします。アップグレードを妨げたり、それほど特別ではない特別なケースを作成したりするため、機能しません。ルールがすぐに馬鹿げていると見なされることがよくあります。]
ただし、複数のバージョンだけでなく、複数のサーバーが存在する状況は危険です。
同じテクノロジースタックが必要です。異なるバージョンを使用できます。しかし、異なる製品ではありません。
ただし、開発者は多くの場合、本番環境よりも新しいバージョンを使用します。これが、変更がパイプラインを下ってステージング(そして最終的には)本番環境に移行する方法です。
難しいのは、何が正しいかについてコンセンサスを達成することです。一部の人々が単に協力することを拒否するならば、彼らのマネージャーが彼らがするための新しいことを見つける時が来ました。
本番サーバーと同様の統合サーバーが必要です。
私見では、開発者が望むものを開発することが重要です(たとえば、Tomcatを使用してlocalhostを開発するのは、WASを使用して1日に10回のデプロイメントを行うことで、高速で幸運が訪れるからです...)。ただし、開発が終了したら、統合サーバーをステージアップして、そこでアプリをテストします。これは、本番サーバーと可能な限り類似している必要があります。
余裕があれば、複数の環境があります(たとえば、4種類のサーバーでテストしたことがあります)。
私はあなたが望むものはかなり賢明だと思います。アプリケーションが1つのタイプのサーバーでのみ実行される場合は、そのサーバーの構成を模倣して、開発中に何かが機能するかどうかをすぐに知ることができます。異なる環境によるバグを蓄積させても意味がありません。
もう1つの方法は、継続的インテグレーションツールを使用することです。これにより、開発者はデプロイメントサーバーで機能するかどうかをすぐに知ることができますが、最も生産性の高い環境を使用できます。
Websphereに関して、ライセンスの問題により開発者が開発にもWebsphereを使用できない場合、(JBossなどと比較して)最良の代替手段はおそらく Websphere Community Edition です。コードベースは通常のWASとは異なりますが、IBMは、他のアプリケーションサーバーの代わりに使用するように開発者を説得するために、可能な限り互換性を持たせるように努めています。
これらすべての環境は可能な限り近くにあるべきだと思います。私はTomcat(テスト)では発生したがJetty(開発)では発生しなかったバグに悩まされてきました。ライブになる前にそれらをキャッチしましたが、開発の早い段階でそれらをキャッチする方がはるかに簡単でした。
さらに悪いことに、一部のバグは開発者のコンピューターでのみ発生し、テスト(本番環境に近い)では発生しなかったため、無関係な問題に時間を浪費することになりました。
本番環境に近いほど、サーバーは同一である必要があります。その目的は、最終的なインストールに予期しない問題、つまり「うまくいく」症候群がないことを確認することです。ただし、開発に近づくほど、実験の自由度が高くなります。したがって、プラットフォームのセット全体が同一である必要はなく、実際には同一である必要はありません。
あなたが正しく行っていることの1つは、自動ビルドスクリプトを使用することです。 ANTであるかMavenであるかは、アプリケーションがコンパイルされ、JARが毎回同じ方法でアセンブルされるという事実ほど重要ではありません。これは、多くの問題を回避するのに役立ちます。
あなたが言及した問題点(アプリケーションサーバーの違いによるバグ)は両刃の剣です。アプリが公開されるアプリケーションサーバーが多いほど、問題を解決した後の移植性が高まります。一方、顧客が自分のアプリサーバーに自由にインストールできるアプリケーションを構築していない限り、移植性に必要な余分な作業は、他の、おそらくもっと重要なバグの修正に費やすことができる時間を浪費するだけです。
アプリケーションサーバーの選択がクライアントのITポリシーによって制約されることがあるのは、悲しい事実です。 「IBMまたはOracleを使用する必要があります。そうです」その場合、少なくともテストサーバー以降のすべてが本番サーバーと同じアプリケーションサーバーを使用する必要があります。開発用地では、代替アプリケーションサーバーの1つのみで標準化することをお勧めします。 Mavenに移行する場合(あなたがそうであるように聞こえますが)、Jettyは自然な一致です。 MavenはJettyを優先するため、アプリサーバーでアプリケーションを実行するのはmvn jetty:run
( この記事を参照 )と入力するだけです。
基本的に、問題が発生する可能性のあるものの数を最小限に抑える必要があります。テスト段階で非互換性の問題の大部分を捕らえることができれば、あなたはゲームよりはるかに進んでいます。ステージングは、本番環境で問題が発生する可能性のあるインストールの問題を見つける最後のチャンスとなるため、本番環境とほぼロックステップになるはずです。本番環境で使用する必要があるのと同じ硬化プロセスを、ステージングでも使用する必要があります。テストでは、ステージングと本番の両方で使用されるのと同じテクノロジースタックを使用する必要がありますが、ロックステップで維持する必要はありません。使用しているサーバーまたはライブラリのアップグレードによる問題を見つけるのは、これが最初の機会になります。